我正在开发一个项目,其中“学生”线程将使用信号量来唤醒“TA”线程。
我有一个名为 studentNeedsHelp_Sem
的信号量
我用 sem_init(&studentNeedsHelp_Sem, 0 ,0);
初始化它
在创建我的任何学生或助教线程之前,我会添加以下 3 行:
printf("DEBUG WAITING\n");
sem_wait(&studentNeedsHelp_Sem);
printf("DEBUG DONE WAITING\n");
应该发生什么:DEBUG WAITING
打印出来,那么我们必须等到学生真正需要帮助(并调用 sem_post(&studentNeedsHelp_Sem)
)才能看到 DEBUG DONE WAITING
发生了什么:两者都在我的学生线程开始之前打印出来。
(我在 OSX 上使用 C 语言工作,使用 POSIX pthreads)
感谢您的帮助!
最佳答案
检查sem_wait
的返回值(正如您在调用库函数或系统调用时总是所做的那样)。它可能是负数,表明有错误;查看errno
或使用perror
来显示错误。如果它是 EDEADLK,我不会感到惊讶。
确实,如果没有启动任何线程,那么肯定没有人发布信号量。所以 sem_wait 根本不会返回。这是一个僵局;你的程序正在等待一些被证明永远不会发生的事情。 OSX 的线程库可能会检测到这一点,并让 sem_wait
返回并返回错误,假设这不是您想要的,并且至少如果 sem_wait
返回您的程序有机会恢复。
关于c - sem_wait() 似乎并没有真正在等待。我可能做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35777362/