我正在尝试在多线程程序上实现相互交换。我不确定我做得对,而且很难测试。
在 main.cpp 中,我有类似的内容:
//mutex handle
HANDLE hIOMutex = CreateMutex (NULL,FALSE,NULL);
//main
while (1) {
Sleep(STEP);
WaitForSingleObject(hIOMutex,INFINITE);
//DO STUFF
ReleaseMutex(hIOMutex);
}
return 0;
在其他帖子使用的功能中:
void Case::account_login(Connection* Con) {
//mutex handle
HANDLE hIOMutex = CreateMutex (NULL,FALSE,NULL);
WaitForSingleObject(hIOMutex,INFINITE);
//DO STUFF
ReleaseMutex(hIOMutex);
return;
}
这是对的吗?代码部分是否使用相同的HANDLE,或者我是否在本地声明它们并因此搞砸了功能?
如果我错过了任何重要信息,请告诉我。
感谢。
答案 0 :(得分:0)
代码部分是否使用相同的HANDLE,或者我是否在本地声明它们并因此搞砸了功能?
不,他们没有使用相同的句柄或相同的互斥锁(对于同一个互斥锁可能有多个句柄)。在发布的代码中,两个线程都有自己的互斥锁,这意味着对这两个互斥锁保护的公共数据的访问不会“互斥”。
您的选择或多或少:
Connection
struct / class 编辑:我把“把手柄变成一个全局变量”是有道理的:这是该组中最糟糕的选择。但是,由于OP坚持一个例子......
// globals.h
#include <windows.h>
extern HANDLE hIOMutex;
// globals.cpp
#include "globals.h"
HANDLE hIOMutex = INVALID_HANDLE_VALUE;
// main.cpp
#include "globals.h"
int main ()
{
// initialize global variables.
hIOMutex = CreateMutex (NULL,FALSE,NULL);
// main code.
while (1) {
Sleep(STEP);
WaitForSingleObject(hIOMutex,INFINITE);
//DO STUFF
ReleaseMutex(hIOMutex);
}
}
// case.cpp
#include "case.h"
#include "globals.h"
void Case::account_login(Connection* Con)
{
WaitForSingleObject(hIOMutex,INFINITE);
//DO STUFF
ReleaseMutex(hIOMutex);
}
答案 1 :(得分:0)
我会使用一个命名的互斥锁,特别是如果使用互斥锁的两个地方位于不同的地方。但是,请确保在一个位置创建Mutex_Name
以避免拼写错误
LPCTSTR lpMutex_Name = <name>;
//mutex handle
HANDLE hIOMutex = CreateMutex (NULL,FALSE,lpMutex_Name);
//main
while (1) {
Sleep(STEP);
WaitForSingleObject(hIOMutex,INFINITE);
//DO STUFF
ReleaseMutex(hIOMutex);
}
return 0;
And in a function used by the other thread:
void Case::account_login(Connection* Con) {
//mutex handle
HANDLE hIOMutex = CreateMutex (NULL,FALSE, lpMutex_Name);
WaitForSingleObject(hIOMutex,INFINITE);
//DO STUFF
ReleaseMutex(hIOMutex);
return;
}