我是否正确实施了相互交流?

时间:2011-09-26 00:14:33

标签: c++ mutex

我正在尝试在多线程程序上实现相互交换。我不确定我做得对,而且很难测试。

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,或者我是否在本地声明它们并因此搞砸了功能?

如果我错过了任何重要信息,请告诉我。

感谢。

2 个答案:

答案 0 :(得分:0)

  

代码部分是否使用相同的HANDLE,或者我是否在本地声明它们并因此搞砸了功能?

不,他们没有使用相同的句柄或相同的互斥锁(对于同一个互斥锁可能有多个句柄)。在发布的代码中,两个线程都有自己的互斥锁,这意味着对这两个互斥锁保护的公共数据的访问不会“互斥”。

您的选择或多或少:

  1. 将互斥锁作为参数传递给线程函数
  2. 将互斥锁句柄定义为Connection struct / class
  3. 的成员
  4. 使用命名的互斥锁(在一侧创建指定的互斥锁,在另一侧打开指定的互斥锁)
  5. 使句柄成为全局变量。
  6. 编辑:我把“把手柄变成一个全局变量”是有道理的:这是该组中最糟糕的选择。但是,由于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;
}