C ++中的Pthread用法

时间:2013-05-29 11:13:04

标签: c++ multithreading pthreads

我目前正在制作实习生,并且我被要求使用C ++编写多客户端服务器 - 客户端应用程序。因此,我正在尝试学习线程。有一个问题:

我想要打印“你在线程A中”,然后“你在线程B中”,“现在你再次进入线程A”。但是它只打印前两个句子并忽略endl命令。无法准确理解它是如何工作的。如何解决这个问题,你能简单解释一下工作机制吗?

为什么主线程在所有函数调用完成之前退出?

void  * function1(void * arg);
void  * function2(void * arg);


pthread_t thr_A, thr_B;
int main( void )
{

    pthread_create(&thr_A, NULL, function1, (void*)thr_B); 
    pthread_create(&thr_B, NULL, function2,NULL); 

return 0;

}

void * function1(void * arg)
{

  cout << "You are in thread A" << endl;
  pthread_join(thr_B, NULL);
  cout << "now you are again in thread A" << endl; 
  pthread_exit((void*)thr_A);


}

void * function2(void * arg)
{
    cout << " you are in thread B "  << endl ;
    pthread_exit((void*)thr_B);
}

1 个答案:

答案 0 :(得分:1)

在主要功能中,您可以创建一个竞争条件。线程可以按任何顺序启动,除非您专门同步代码,以便强制执行其中一个或另一个启动。 因此,也无法分辨出哪个会先完成。然后你也有你的主线程,它甚至可能在你创建的线程完成之前完成。使用pthread时,必须调用pthread_join才能等待线程完成。你可以这样做:

int main( void )
{
    // you pass thread thr_B to function one but 
    // function2 might even start before function1
    // so this needs more syncronisation
    pthread_create(&thr_A, NULL, function1, (void*)thr_B); 
    pthread_create(&thr_B, NULL, function2,NULL); 

    //this is mandatory to wait for your functions
    pthread_join( thr_A, NULL);
    pthread_join( thr_B, NULL);

    return 0;

}

为了在function1中等待,您需要更复杂的同步方法,例如参见pthread_cond_wait pthread_cond_signal,如下所述:https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal 你还应该从函数1中删除pthread_join,因为根据man pthread join:“如果多个线程同时尝试使用同一个线程连接, 结果未定义。“

关于David hammen的评论

编辑

void * function1(void * arg)
{

  cout << "You are in thread A" << endl;
  //Remove the next line and replace by a pthread_cond_wait.
  pthread_join(thr_B, NULL);
  cout << "now you are again in thread A" << endl; 
  pthread_exit((void*)thr_A);

}