sem_wait()似乎并没有真正等待。我可能做错了什么?

时间:2016-03-03 16:15:10

标签: c multithreading wait semaphore

我正在开展一个项目,其中一个学生"线程将使用信号量唤醒一个" 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)

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

检查sem_wait的返回值(因为每当调用库函数或系统调用时, 始终 都会这样做)。它可能是否定的,表示错误;查看errno或使用perror来显示错误。如果它是EDEADLK,我不会感到惊讶。

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