我正在开展一个项目,其中一个学生"线程将使用信号量唤醒一个" TA"线程。
我有一个名为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
< / p>
发生了什么:两者都是在我的学生线程开始之前打印的。
(我在OSX上用C工作,使用POSIX pthreads)
感谢您的帮助!
答案 0 :(得分:3)
检查sem_wait
的返回值(因为每当调用库函数或系统调用时, 始终 都会这样做)。它可能是否定的,表示错误;查看errno
或使用perror
来显示错误。如果它是EDEADLK
,我不会感到惊讶。
实际上,如果没有线程启动,那么肯定没有人发布信号量。所以sem_wait
永远不会回来。这是一个僵局;你的程序正在等待可能永远不会发生的事情。可能是OSX的线程库检测到这一点并且sem_wait
返回错误,假设这不是您的意图,并且至少sem_wait
返回您的错误程序有机会恢复。