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

标签 c multithreading wait semaphore

我正在开发一个项目,其中“学生”线程将使用信号量来唤醒“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/

相关文章:

JQuery delay() 函数被跳过

C - crypt() - 代码执行 5 个循环或更多比使用 4 个循环但使用相同的参数/哈希需要更长的时间

c - 最好使用 C/C++ 查找无效的 bz2 文件

C 程序 - 取消引用指针

c# - 多线程C#应用程序占用了很高的CPU使用率

java - 通知和等待对于同步块(synchronized block)不起作用

c++ - *(void **) 是什么意思?

java - 为什么并发练习书中的SafePoint类标记为@ThreadSafe?

c# - 自更新集合并发问题

ERLANG wait() 和阻塞