在C ++中创建线程的基本问题

时间:2011-01-12 08:42:43

标签: c++ multithreading

我有一个类成员functionA,它创建一个运行另一个functionB的线程。 FunctionB会执行一些操作并在一段时间后停止(它是一种火和忘记函数调用,并且所需的functionA调用和线程的数量将取决于运行时结果)。 FunctionA将被多次调用。我意识到pthread_create会在第一个参数中使用pthread_t,并且在创建线程时pthread_t必须可用。所以,我不能像下面那样将它声明为本地。那我在哪里可以声明pthread_t?

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)
{

}

4 个答案:

答案 0 :(得分:2)

首先,您可以将您的pthread_t放在堆栈上:您的functionA在这方面没问题。 pthread_create直接存储线程句柄,因此只要它返回句柄就有效。新创建的线程尚未开始执行,但这并不重要,因为它不会触及该句柄。

但是,您需要以某种方式管理您的主题。如果您未明确创建它,则必须在您的句柄上调用pthread_joinpthread_detach。如果你没有打电话那么你就是在泄漏资源。如果这确实是一个“即发即弃”的线程,那么你应该使用pthread_detach来确保操作系统在线程完成时清理。

无论哪种方式,您都需要确保线程访问的对象比线程对它们的任何潜在访问要长(例如,通过不破坏它们直到“我不再需要这些对象”标志)< / p>

答案 1 :(得分:1)

你可以在堆栈上有一个pthread_t变量,没有问题。

有没有理由不使用像boost :: thread这样的线程包装器?它会让你的生活更轻松。 http://www.boost.org/doc/libs/1_45_0/doc/html/thread/thread_management.html

另一件事是你不能只是解雇并忘记一个线程,因为一旦你做了这个对象,在另一个线程停止访问它之前一定不能销毁它。换句话说,对象的析构函数必须确保没有其他线程访问该对象。

答案 2 :(得分:0)

我不相信你有问题,因为pthread_create()在新的线程标识符写入t之前不会返回,因此根本不需要new pthread_t 。当然,你需要检查pthread_create()的回报。

答案 3 :(得分: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
}