C++ WaitForSingleObject在XP中获取信号量,但在Vista中不获取

C++ WaitForSingleObject在XP中获取信号量,但在Vista中不获取,c++,concurrency,windows-vista,semaphore,C++,Concurrency,Windows Vista,Semaphore,以下代码在我的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 F

以下代码在我的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机器上编译的这个二进制文件,快速版fwiw不能在Vista中工作吗?正如我上面所说,WaitForSingleObject调用永远不会结束


谢谢

我现在无法查看,但听说了,请尝试: 将CreateSemaphore的第一个参数从NULL更改为SECURITY\u属性的空实例

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

顺便说一下,lMaximumCount=1的命名信号量完全等同于命名互斥。所以回顾一下使用互斥的可能性

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

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

我仍在苦苦思索,为什么当我删除信号量代码时,我能够访问用户函数应该提供的资源,即使该函数没有运行。但这是另一个问题


感觉很好

MSDN说ReleaseSemaphore需要SEMAPHORE\u MODIFY\u STATE安全属性。您正在使用NULL作为CreateSemaphore中security属性的参数。你能用这个安全属性集再试一次吗?@Naveen,一旦OpenSemaphore成功了,而且它显然像OP可能注意到的那样成功了,句柄就有了对SEMAPHORE\u MODIFY\u STATE的访问权。@philo,这段代码在Vista上对我来说很好,即使我将代码片段放在单独的进程中。您的流程有什么特别的地方吗?还是一个普通的不相关的应用程序?谢谢您的回复。这是我知道的Filemaker插件的一部分。。。还有很多事情要做。我制作了一个小型控制台应用程序来尝试隔离问题,只需创建信号量,生成一个线程来释放信号量,并调用WaitForSingleObject。到目前为止,它已经成功地执行了。幸运的是,我今天有几个小时的时间来解决这个问题……如果我成功了,我会更新。再多了解一点背景:这个插件有一个在Filemaker启动时执行的函数。它还有另一个函数,用户可以将其作为计算字段的一部分调用。我想启动一个服务器,该服务器使用的资源仅对用户功能可用。因此,startup函数生成一个线程,该线程创建信号量并等待这个用户调用的函数打开并释放它。我只是试着删除WaitForSingleResource调用作为一种精神状态检查,并确保其他一切在Vista中正常工作。它工作正常,所以它肯定是信号灯。我要试试杜菲的互斥建议。没关系哇,谢谢你的快速回复!虽然添加了与此代码相同的行为。看起来@Naveen是正确的,要调用ReleaseSemaphore,只需要SEMAPHORE\u MODIFY\u状态。