LINUX.ORG.RU

Не понятки с pthread_create


0

0

Имеется следующий код

#include "Library.h"
#include "Socket.h"

Database<User> object;


void *cnthread(void*);
void *funthread(void*);

bool comand(string &line,Database<User> &object) {
    Server_comand com;
    int result = com.strpars(line);
    if (result == 1) {
        
        string test = object.countlist();
        cout << "Список пользователей:" << endl;
        cout << test << endl;
        
        return true;
    }
    else if (result == 2) {
        
        int index = object.findNextContains(com.Getnum());
        if (index !=0 ) {
            User& curUser = object.getData(com.Getnum());
            curUser.on_off(false);
            return true;
        }
        cout << "Error not found! User" << endl;
    }
    else if (result == 3) {
        return false;
    }
    else {
        cout << "Error comand not found!" << endl;
        return true;
    }
}

int main(int argc, char * argv[]) {
    ....... 
    int rc1;
    pthread_t threadc;
    //Создаём нить сервера для ввода команд
    if( (rc1=pthread_create( &threadc, NULL, &cnthread,(void*)&object)) ) {
        printf("Thread creation failed: %d\n", rc1);
    }
    while (1) {

        if (recievpack.command() == INSTR_REG) {
            User usr;
            if ( index == 0) {
                pthread_t thread;
                int rc, id_user = recievpack.id_usr();
                if (id_user != 0){
                    usr.recordId(recievpack.id_usr());
                    object.insertData(usr, id_user);
                    
                    usr.Struct_info(client_info);
                    usr.on_off(true);
                    
                    //Создаём нить
                   if( (rc=pthread_create( &thread, NULL, &funthread, (void*)&usr)) ) {
                        printf("Thread creation failed: %d\n", rc);
                    }
                    sr.SendLine(recievpack.MakePack(ACK, 0, usr.recordId()), client_info);
                }
            }
            else{
                //Послать команду exit либо generate
            }
            
        }
        else {
            if ( index != 0) {
                User& getuser = object.getData(index);
                getuser.Current_pack(receive);
                getuser.Package_come(true);
            }
        }
        receive.erase();
    }
    
    return 0;
}
void *cnthread(void* param){
    //Database<User> &list =( Database<User>& )param;
    
    while(1) {
        string pars;
        getline(cin, pars);
        cout << object.countlist() << endl;
        //cout << list.countlist() << endl;
        
        if (comand(pars,object)==false)
            break;
    }
    exit(0);
}
void *funthread(void* param) {
    User *user = (User*)param;
    //int index = *((int*)param);
    
    User& usr = object.getData(user->recordId());
    cout <<  object.countlist() << endl;
	
    ......

Не могу понять почему при использовании функции comand работает, объект класса object становится пустым, как будто новый объект создаётся. Если использовать закоменченную строчку

//Database<User> &list =( Database<User>& )param; 
То он начинает видеть передаваемый объект, но передача идёт криво, собственно вопрос, как сделать чтоб глобальную переменную объекта класса можно было использовать во всех функциях и объект изменялся везде, или как правильно передать в
pthread_create( &threadc, NULL, &cnthread,(void*)&object); 
объект, чтоб в самой функции cnthread можно было получить ссылку на объект. Причём во 2 нити
if( (rc=pthread_create( &thread, NULL, &funthread, (void*)&usr))
он видит его нормально и все данные на месте.

Очевидно, что объект уничтожается при выходе из блока, а внутри потока ты уже работаешь с памятью по которой раньше находился объект, а теперь ничего нет.

Reset ★★★★★ ()

Немного дополню
1. Почитай что exit, что она делает когда вызывается в потоке.
2. Почитай про case

Boy_from_Jungle ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.