我目前正在制作实习生,并且我被要求使用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);
}
答案 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:“如果多个线程同时尝试使用同一个线程连接,
结果未定义。“
编辑:
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);
}