2014-02-06 30 views
0

我有一个classA创建一个线程,我希望线程运行,直到一个变量设置为false。c + + pthread不工作

创建线程,如:

ClassA::ClassA(): 
m_bContinue(true), 
{ 
    pthread_mutex_init(&m_mutex, NULL); 
    pthread_create(&m_thWorkThread, NULL, &ClassA::ThreadProc, this); 
} 

我想线程只要运行的pClassA->继续()返回true。

void* ClassA::ThreadProc(void *p) //ThreadProc defined as static member function 
{ 
    ClassA *pClassA = reinterpret_cast<ClassA*>(p); 

    if(pClassA != NULL) 
    { 
     while(pClassA->Continue()) 
     { 
      printf("in the while \n "); 

     } 
    } 
    else 
     printf("pClassA null \n"); 
} 

继续正在返回在构造函数中设置为true的m_bcontinue。

bool ClassA::Continue() 
{ 
    return bContinue; 
} 

当我运行它,它只是进入while循环一次,并打印“的同时”,并计划停止。当我执行strace时,我看到了由SIGSEGV +++杀死的消息+++。 当我改变像while循环:

while(1){} 

能正常工作。我错过了什么?

回答

0

您无法使用pthread_create启动成员函数。相反,使用正常功能,通过this它和调用所需的功能:

void *ThreadProc (void *p) 
{ 
    reinterpret_cast<ClassA*>(p)->ThreadProc (p); 
    return 0; 
} 

... 
pthread_create(&m_thWorkThread, NULL, &ThreadProc, this); 

或者,而是你可以使用C++ 11和std::thread,允许发起类成员函数。

+0

你是什么意思“正常功能”?在我的情况下,我将ThreadProc定义为静态成员函数。你的意思是用ThreadProc函数定义另一个类吗? –

+0

@AvbAvb啊,它是静态的。正常我的意思是非成员函数,但静态也很好。那么你的代码很好,它在while循环中崩溃可能是因为在其他地方的堆损坏。 –

0

类型A的对象可能比线程的生命周期短吗?看起来对象A过早死亡。使用while(1),您不再引用A.

0

快速的问题。 pthread_join在这里。我希望你没有错过它。只是好奇。