【发布时间】:2010-05-02 00:52:40
【问题描述】:
我正在处理一个我们必须使用信号量来解决的问题。我有一个数组,其中包含两个信号量gsem,并在特定条件下调用sem_wait(&(gsem[me])),它应该一直等到该特定进程被唤醒。但是,由于某种原因,它给了我错误Bad file descriptor。我查了sem_wait,Open Group 规范说这不是sem_wait 可能导致的错误。这让我的整个程序变得疯狂,我不知道为什么会失败。
编辑:违规代码,按要求。
120 sem_wait(&mutex);
121 if (inside[opp] > 0 || waiting[opp] > 0) {
122 sem_wait(&screen);
123 printf("%s %u waiting\n", names[me], t);
124 sem_post(&screen);
125 waiting[me]++;
126 sem_post(&mutex);
127 int hg = sem_wait(&(gsem[me]));
128 if (hg < 0)
129 printf("%s\n", strerror(errno));
130 }
我应该注意,这是一项我们需要使用信号量的家庭作业。教授称其为“男女通用浴室”。男性和女性都可以使用它,但不能同时使用。 inside[opp] 是卫生间的异性人数。 waiting[opp]是等待使用的异性号码。 screen 是一个信号量,它锁定对stdout 的访问。该解决方案基于我们教科书中给出的使用传递接力棒的读者/作者问题的解决方案。
我还应该注意,我们首先必须在 Ada 中编写一个解决方案,然后将其转换为 C。我的 Ada 解决方案有效,并且我逐字翻译了它。我敢肯定这是一些小的语法细节。最后,如果有帮助的话,我正在研究 Snow Leopard。
【问题讨论】:
-
显示代码 :-) 好吧,代码的最小版本仍然有问题。
-
请显示您的代码,同时列出您所针对的平台/操作系统。另外,为什么不使用互斥锁?信号量没有那么快或那么健壮,具体取决于操作系统/实现
-
Sam,mutex 是互斥 semaphore 的缩写,一种特定的信号量类别,资源限制为 1。而且,即使 OP 使用其他信号量,也可能因为,我引用,“我们必须使用信号量”。 :-)
-
是的,我知道互斥锁是什么,谢谢...但是某些类型的互斥锁比 posix 信号量更快。 Futexes,内核互斥体等。因此我的问题。
-
添加了违规代码以供参考。还有关于问题和我的系统的详细信息。