2011-01-12 3 views
1

У меня есть функция-член класса A, которая создает поток для запуска другой функцииB. FunctionB будет выполнять некоторую операцию и останавливаться через некоторое время (это своего рода пожар и вызов функции забывания, а количество вызовов функции и потоков, необходимых для этого, зависит от результата выполнения). Функция A будет вызываться несколько раз. Я понял, что pthread_create будет принимать pthread_t для первого параметра, а pthread_t должен быть доступен при создании потока. Поэтому я не мог объявить его локальным, как показано ниже. Итак, где я могу объявить pthread_t?Основной вопрос при создании потока в C++

void classA::functionA(int param) 
{ 
    pthread_t t; //could not declare local because functionA might return and destroy t before thread being created. 
    pthread_create(&t , NULL, functionB, param); 
} 

void functionB(int param) 
{ 

} 
+0

Даже если 't' уничтожен, как он влияет на выполнение' functionB'? – Jaywalker

+0

Иногда я получаю ошибку сегментации. Поэтому я предполагаю, что это потому, что t уничтожается до создания потока. – Nick

ответ

0

Я не верю, что у вас есть проблема, как pthread_create() не будет возвращать до нового идентификатор потока был написан в t, так что нет необходимости делать new pthread_t вообще. Тем не менее, вам нужно проверить возвращение с pthread_create().

0

Я хотел бы сделать это следующим образом:

class classA 
{ 
    void functionA(); 
    static void void functionB(classA* aThis); 
}; 

void classA::functionA(int param) 
{ 
//create thread: note that this way pthread_t can even become the class-member 
} 

void classA::functionB(classA* aThis) 
{ 
    classA* theThis = static_cast<classA*>(aThis); 
    //now you can access classA members here easily 
} 
1

Вы можете иметь переменную pthread_t в стеке, нет никаких проблем с этим.

Есть ли причина, по которой вы не используете обертку потоков, например boost :: thread? Это сделало бы вашу жизнь намного легче. http://www.boost.org/doc/libs/1_45_0/doc/html/thread/thread_management.html

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

2

Во-первых, вы можете положить свой pthread_t в стек: ваш functionA в порядке. pthread_create сохраняет дескриптор потока напрямую, поэтому, как только он возвращает дескриптор, действителен. Недавно созданный поток не обязательно начал выполняться, но это не имеет значения, поскольку оно не будет касаться этого дескриптора.

Однако вам необходимо как-то управлять своей нитью. Если вы явно не создадите его отдельно, вы должны должны позвонить по номеру pthread_join или pthread_detach на ручку. Если вы не звоните, вы теряете ресурсы. Если это действительно «поток огня и забыть», вы должны использовать pthread_detach, чтобы гарантировать, что ОС очистится, когда заканчивается нить.

В любом случае, вам необходимо убедиться, что объекты, к которым обращается поток, передают любой потенциальный доступ к ним потоком (например, не уничтожая их до тех пор, пока не будет установлен флаг «Мне не нужны эти объекты»)

Смежные вопросы