gpt4 book ai didi

C 信号量 : sem_wait throwing inexplicable error

转载 作者:太空宇宙 更新时间:2023-11-04 00:56:06 24 4
gpt4 key购买 nike

我正在研究一个我们必须使用信号量来解决的问题。我有一个数组,其中包含两个信号量 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。

最佳答案

请记住,单一 UNIX 规范不一定是您的案例中的控制文档。诚然,它可能应该是,但由于您没有实际指定平台,可能是因为您所处的环境决定遵循不同的规则和/或具有其他返回码。

有几件事要检查。

1/您确定 sem_wait 返回 -1 吗?我见过编码人员在调用后简单地检查 errno,却没有意识到大多数调用不会在成功时将其设置为零,而只是将其置之不理。如果 errno 设置为 EBADF sem_wait 调用之前,则可能会出现这种情况。

2/您是否遵循了创建信号量的所有规则,例如初始化它们?

3/你指的是一个有效的信号量吗?首先,您确定 me 索引没有超出范围吗?

除了看到一些代码,这就是我必须提供的所有建议。


我粗略谷歌 sem_wait ebadf 发现的一件事是 here .事实证明,这是在线程环境中使用 errno 而不包含正确的 header 时出现的问题。

通过这样做,全局 errno value 被使用而不是正确的线程 macro (这会给线程特定的 错误号)。

这是否是你的问题,我不知道,但它可能值得研究。


更紧密地跟随这条消息链,还有一些其他的可能性。

4/您是否使用sem_init 来初始化信号量。如果是,检查它的返回值。这些消息来自 2008 年,因此可能是过时的信息,但 OSX 可能仍不支持 sem_init,更喜欢 sem_open(请参阅 here)。你真的应该检查 所有 你的 sem_ 函数的返回码,只是为了确定(如果你对它们都使用 sem_init (如果它不受支持)并且只检查一个,您可能会发现它们全部都失败了)。

5/有(曾经?)一个 race condition在 OSX 下的线程 errno 函数链中,其中 __error 函数在使用 errno 之前调用了另一个库调用 pthread_self (在主线程,或其他线程中的 current_thread->errno)。从技术上讲,这是不允许的,并且存在一个可能会出现问题的小窗口。

关于C 信号量 : sem_wait throwing inexplicable error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com