Размер буфера pthread_create.Недостаточно? - PullRequest
0 голосов
/ 12 декабря 2011

Я пытаюсь создать тему с функцией pthread_create.Вызов выглядит примерно так: res pthread_create(&threadID, &atributte, function, argument)

res значение всегда 0, что означает, что pthread_create запускает поток правильно.Проблема, я думаю, в последнем параметре (аргументе).Это слишком длинная строка, и я думаю, что это приводит к сбою моей программы, потому что, если я пытаюсь использовать более короткую строку, все это правильно и заканчивается правильно.

Мне было интересно, если pthread_create создает поток с определенным количествомпамяти и если кто-либо из вас знает это количество.

PD: Мой журнал ничего не показывает, я помещаю cout в первую строку function, но никогда не читается, потому что моя программа аварийно завершает работу до этогослучается.

Спасибо всем!

Редактировать: Остальной код, как я создаю тему.

    void znkModulePlugin::createMainProcess(void* mod){
znkModulePlugin* module = static_cast<znkModulePlugin*>(mod);
try{
    int res = 0;
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    res = pthread_create(&threadID, &attr, znkModulePlugin::launchThread, module); 
}catch(exception e){
    stringstream log_msg;
    log_msg << " CRIT znkModulePlugin::createMainProcess() -> Critical Error: " << e.what() << ". Reseting Node.";
    logData(log_msg.str());
}

}

1 Ответ

1 голос
/ 14 декабря 2011

Следуйте этой схеме, чтобы избежать проблем:

1) Выделите new объект / структуру, содержащую информацию, необходимую новому потоку.

2) Вызовите pthread_create, передав ему указатель на новый объект.

3) Когда поток завершит доступ к информации, delete объект / структура.

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

...