0

我目前正在实习,我被要求使用 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);
}
4

1 回答 1

1

在您的主要功能中,您创建了一个竞争条件。线程可以按任何顺序启动,除非您专门同步您的代码,以便强制其中一个或另一个启动。因此,也无法判断哪个会先完成。然后你也有你的主线程,它甚至可能在你创建的线程完成之前完成。使用 pthreads 时,您必须调用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;

}

为了在函数 1 中等待,您需要更复杂的同步方法,例如,请参见以下示例pthread_cond_wait pthread_cond_signalhttps ://computing.llnl.gov/tutorials/pthreads/#ConVarSignal 您还应该从函数一中删除 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);

}
于 2013-05-29T11:52:40.500 回答