以下代码在我的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,Express Edition fwiw的XP机器上编译)在Vista中不起作用?正如我上面所说,WaitForSingleObject调用永远不会完成。
谢谢!
答案 0 :(得分: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的名为semaphore的方式完全等同于命名的互斥锁。因此,请查看使用互斥锁的可能性。
答案 1 :(得分:0)
解决。这完全是用户错误。感谢@Dewfy,@ Naveen和@avakar的深思熟虑的回应。
我确信正在调用用户函数,因为我在Filemaker布局中显示了它的结果。我没有意识到的是默认情况下会缓存这些返回值。该函数从未被调用过。你的建议真有帮助,因为直到我完全明白我用我的线程和信号量做了什么,我才能退后一步说“坚持下去,有些事情不在这里”。
我仍然在努力解决为什么当我删除信号量代码时,我能够访问用户函数应该提供的资源,即使该函数没有运行。但这是一个单独的问题。
感觉很好