1

以下代码在我的 XP SP2 机器上运行良好,但在我的 Vista 机器上运行时,对 WaitForSingleObject 的调用会无限期地等待:

HANDLE ghSemaphore;
ghSemaphore = CreateSemaphore(NULL, 0, 1, "COM_PHILOERTEL_FINA");
if (ghSemaphore == NULL) {
 MessageBoxA(NULL,"Error creating semaphore","ERROR",0);
 return FALSE;
}

MessageBoxA(NULL,"Semaphore created. Waiting for it to be triggered","ERROR",0);
WaitForSingleObject(ghSemaphore, INFINITE);
// got the semaphore, ready to rock

MessageBoxA(NULL,"Got the semaphore, ready to rock!","Notice",0);

这是释放信号量的线程:

 ghSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "COM_PHILOERTEL_FINA");
 if (ghSemaphore == NULL) {
  MessageBoxA(NULL,"Failed to open semaphore","ERROR",0);
  return FALSE;
 }

 if (0 == ReleaseSemaphore(ghSemaphore, 1, NULL)) {
  MessageBoxA(NULL,"Plugin was unable to release the semaphore","ERROR",0);
  return FALSE;
 }

命名信号量是最近添加的,没有任何好处。在此之前,线程只是与其匿名信号量共享 ghSemaphore。没有明显区别。有谁知道为什么这个二进制文件(在 VC6 的 XP 机器上编译,Express Edition fwiw)在 Vista 中不起作用?正如我上面所说,WaitForSingleObject 调用永远不会结束。

谢谢!

4

2 回答 2

0

解决了。这完全是用户错误。感谢@Dewfy、@Naveen 和@avakar 的周到回复。

我确信正在调用用户函数,因为我在 Filemaker 布局中显示了它的结果。我没有意识到这些返回值是默认缓存的。该函数从未被调用。你的建议真的很有帮助,因为直到我完全理解我在用我的线程和信号量做了什么,我才能退后一步说“等等,这里有什么不对劲”。

我仍在努力解决为什么当我删除信号量代码时我能够访问用户函数应该提供的资源的谜团,即使该函数没有运行。但这是一个单独的问题。

感觉不错

于 2010-02-06T23:11:57.743 回答
0

我现在无法检查,但听说过,所以尝试:将 CreateSemaphore 的第一个参数从 NULL 更改为 SECURITY_ATTRIBUTES 的空实例

SECURITY_ATTRIBUTES dumy;
dumy.nLength = sizeof(dumy);
dumy.lpSecurityDescriptor = 0;
dumy.bInheritHandle = TRUE;
CreateSemaphore(&dumy, 0, 1, "COM_PHILOERTEL_FINA");

顺便说一下,lMaximumCount = 1 的命名信号量完全等同于命名互斥体。因此,请查看使用互斥锁的可能性。

于 2010-02-06T06:02:35.770 回答