- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在研究一个我们必须使用信号量来解决的问题。我有一个数组,其中包含两个信号量 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/
我想知道是否有人知道为什么 IB 在奇怪的 Nib 上到处都有莫名其妙的高亮区域.. 下面是一个例子: 我的意思是我用红色标记的区域内的亮区... 分割 View 下方没有 View ,没有与之对应的
当我编译并运行以下代码时:(在 cygwin 上使用 gcc) int *a = malloc(1024*1024*100*sizeof(int)); while(1) ; Windows XP 中的
我在一些帖子中读到,使用 JUnit 测试并发并不理想,但我现在别无选择。我刚刚遇到了一个无法解释的异常。 我运行了一个测试,总结一下: 我向执行者提交了 1000 个可运行文件 每个可运行对象都会向
我写了一个非常简单的 bash 脚本: #!/bin/bash nLine=$(awk '/text_to_parse/{ print NR; exit }' testFile.xml) echo "
我正在研究一个我们必须使用信号量来解决的问题。我有一个数组,其中包含两个信号量 gsem,并在特定条件下调用 sem_wait(&(gsem[me])),它应该等到特定进程被唤醒。但是,出于某种原因,
我们安装了 miniprofiler。这是一次有益的体验,但现在我们看到我们的数据库查询在启用分析器的情况下运行速度是禁用分析器时的 3 倍。 我们在应用程序中更改的唯一代码是添加 profiledD
http://jsfiddle.net/VhjR7/1/ 当您点击一次我的列表菜单时,它会展开,但如果您再次点击它,它不会收缩。 问题是 listsExpanded 在被 listsExpand()
所以我一直在研究类型,然后我得出了下面这个奇怪的结果。调试它毫无意义,然后唯一的结果就是检查 c++ spects,这并没有太大帮助。我想知道您是否知道这里到底发生了什么,是否是 32 位和/或 64
我不仅在调试时发现了这种奇怪的行为,而且在正常执行期间也发现了这种奇怪的行为(至少我是这样认为的,基于应用程序的行为)。 如果我使用以下代码(在返回 int 的函数中): try { retu
我在当前项目中比较 DateTime 时遇到了一段糟糕的时光(没有双关语意),特别是比较 ActiveSupport::TimeWithZone 的两个实例。问题是我的两个 TimeWithZone
我正在编写一个简单的 iPhone 应用程序来显示一副纸牌。每次放置按钮时,都会显示一张新卡,无需更换。 每次调用我的buttonPressed方法时,我的牌组类中保存卡片的NSMutableArra
我有两个图标,每个图标都有自己的悬停效果——一个在 Y 轴上旋转,另一个在 Z 轴上旋转,基于以下 CSS: img.icon { width:20px; vertical-align
我是一名优秀的程序员,十分优秀!