2016-03-03 25 views
-1

我正在研究一个“学生”线程将使用信号量唤醒“TA”线程的项目。sem_wait()似乎没有真正在等待。我可能会做错什么?

我有一个名为旗语studentNeedsHelp_Sem

sem_init(&studentNeedsHelp_Sem, 0 ,0);

初始化我的任何学生或TA线程甚至创建之前,我包括这3条线:

printf("DEBUG WAITING\n"); 
sem_wait(&studentNeedsHelp_Sem); 
printf("DEBUG DONE WAITING\n"); 

什么发生:打印DEBUG WAITING,那么我们必须等到学生真的需要帮助(并拨打sem_post(&studentNeedsHelp_Sem))才能看到DEBUG DONE WAITING

什么发生:在我的学生线程开始之前都会打印出来。

(我用C工作OSX,使用POSIX并行线程)

谢谢您的帮助!

+0

'studentNeedsHelp_Sem'在哪里申报?它没有机会离开,是吗? –

+0

@MartinJames在文件中通过'sem_t studentNeedsHelp_Sem;' –

+0

在全局很早就声明了,好吧,我不得不问,信号正常,好吧,工作;) –

回答

3

检查的sem_wait返回值(你应该始终做每当调用库函数或系统调用)。这可能是负面的,表明有错误;看看errno或使用perror来显示错误。如果是EDEADLK,我不会感到惊讶。

事实上,如果没有线程已经启动,那么肯定没有人会发布信号量。所以sem_wait永远不会返回。这是一个僵局;你的程序正在等待可能永远不会发生的事情。可能是因为OSX的线程库检测到这个错误,并且sem_wait返回错误,假设这不是你想要的,并且至少如果sem_wait返回你的程序有机会恢复。

+0

虽然'sem_init'相同。我推荐使用'perror()' – Superlokkus

+0

你说得对,'sem_wait'返回-1。现在,这是一个为什么...我知道这会导致死锁,我这样做是为了调试。但这是一个很好的观点,也许编译器看到了僵局并忽略了等待的呼叫。 –

+0

@Mriest:不是编译器,而是线程库或内核代码。这是一次运行时检查,而不是编译时。 –

相关问题