Windows 在两个不同程序中创建互斥体,相同句柄(gcc)

Windows 在两个不同程序中创建互斥体,相同句柄(gcc),windows,winapi,mutex,Windows,Winapi,Mutex,我写了两个程序,通过tcp进行通信。这两个计划原则上是相同的。 在通过tcp发送消息之前,消息存储在内部缓冲区中。我使用互斥来保护这个缓冲区,以便同时读/写。 为了进行测试,我在同一台电脑上运行了这两个程序,但遇到了一些计时问题。我发现CreateMutex总是在两个程序上返回相同的句柄,所以一个程序阻塞了另一个 hBufferMutex = CreateMutex(NULL,FALSE,"BufferMutex"); 无论我使用哪个名称作为互斥体,在两个程序上都是相同的。我做错了什么?如果只

我写了两个程序,通过tcp进行通信。这两个计划原则上是相同的。 在通过tcp发送消息之前,消息存储在内部缓冲区中。我使用互斥来保护这个缓冲区,以便同时读/写。 为了进行测试,我在同一台电脑上运行了这两个程序,但遇到了一些计时问题。我发现CreateMutex总是在两个程序上返回相同的句柄,所以一个程序阻塞了另一个

hBufferMutex = CreateMutex(NULL,FALSE,"BufferMutex");

无论我使用哪个名称作为互斥体,在两个程序上都是相同的。我做错了什么?

如果只是在程序中使用互斥,请使用一个匿名的名称,将其设置为NULL。只有当您想在两个程序之间进行通信时,才会使用名称(…在同一登录会话上运行,这是默认值,或者如果您使用“全局”前缀,则在同一台机器上运行。)


在您的情况下,您可能可以使用关键部分而不是互斥-它基本上是一个更轻量级的版本,只能在进程中使用。

如果您只是在程序中使用互斥,请使用一个匿名名称-将名称设置为NULL。只有当您想在两个程序之间进行通信时,才会使用名称(…在同一登录会话上运行,这是默认值,或者如果您使用“全局”前缀,则在同一台机器上运行。)


在您的情况下,您可能可以使用关键部分而不是互斥-它基本上是一个更轻量级的版本,只能在进程中使用。

如果我将名称设置为NULL或NULL,则没有任何区别。使用
bInitialOwner=TRUE
时,当我第一次调用
WaitForSingleObject
时,我的程序被阻塞。(也许我应该先发布它?!)。但我已经切换到CriticalSection,它现在正在工作。谢谢如果我将名称设置为NULL与否没有任何区别。使用
bInitialOwner=TRUE
时,当我第一次调用
WaitForSingleObject
时,我的程序被阻塞。(也许我应该先发布它?!)。但我已经切换到CriticalSection,它现在正在工作。谢谢