有人可以解释Mutex及其使用方法吗?

时间:2010-08-20 07:17:11

标签: c++ windows multithreading mutex

我阅读了一些关于Mutex的文档,但我唯一的想法是它有助于阻止线程访问已被其他资源使用的资源。

我从Code片段获得并执行了正常工作:

#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;


BOOL FunctionToWriteToDatabase(HANDLE hMutex)
{
    DWORD dwWaitResult;
    // Request ownership of mutex.
    dwWaitResult = WaitForSingleObject(
    hMutex, // handle to mutex
    5000L); // five-second time-out interval
        switch (dwWaitResult)
        {
        // The thread got mutex ownership.
            case WAIT_OBJECT_0:
            __try
            {
                // Write to the database.
            }
            __finally {
            // Release ownership of the mutex object.
            if (! ReleaseMutex(hMutex)) {
            // Deal with error.
        }
            break;
        }
            // Cannot get mutex ownership due to time-out.
            case WAIT_TIMEOUT:
            return FALSE;
            // Got ownership of the abandoned mutex object.
            case WAIT_ABANDONED:
            return FALSE;
        }
    return TRUE;
}

void main()
{
    HANDLE hMutex;

    hMutex=CreateMutex(NULL,FALSE,"MutexExample");

    if (hMutex == NULL)
    {
        printf("CreateMutex error: %d\n", GetLastError() );
    }
    else if ( GetLastError() == ERROR_ALREADY_EXISTS )
        printf("CreateMutex opened existing mutex\n");

    else
        printf("CreateMutex created new mutex\n");

}

但我不明白的是线程在哪里以及共享资源在哪里?任何人都可以解释或提供更好的文章或文件吗?

4 个答案:

答案 0 :(得分:11)

互斥锁提供 mut ually ex 对资源的群集访问权限;在你的情况下,一个数据库。程序中没有多个线程,但您可以运行多个程序实例,这是您的互斥锁正在防范的。实际上,它仍然可以防止来自多个线程的访问,只是这些线程可以位于不同的进程中。

您的代码正在创建一个名为的互斥锁,可以在应用程序的多个实例之间共享。这是进程间通信的一种形式。 CreateMutex上的MSDN文档提供了有关命名互斥锁的其他有用信息:

  

可以调用两个或多个进程   CreateMutex创建相同的命名   互斥。实际上是第一个过程   创建互斥锁,然后创建互斥锁   进程足够的进程   权利只是打开一个句柄   现有的互斥...

     

多个进程可以拥有句柄   相同的互斥对象,可以使用   进程间对象   同步。

只有当您正在使用的数据库本身不支持多线程访问时,才需要使用互斥锁。

答案 1 :(得分:0)

也许这将是你的最佳来源

http://en.wikipedia.org/wiki/Mutual_exclusion

答案 2 :(得分:0)

msdn中的这个link提供了与main()函数中的线程类似的示例。但是,不再包括应该是数据库的共享资源 无论如何,共享资源是需要从多个线程访问的任何内容:settingsfiles,drivers,database,...

请注意,示例中的计数器是在受互斥锁保护的情况下写入的,而在未受保护时已被读取。虽然在这种情况下,可能没有问题,但有点草率。

答案 3 :(得分:-1)

您可以参考此SO帖子以比较各种线程同步机制 Difference between Locks, Mutex and Critical Sections

如果您需要特定信息Mutex,那么维基百科将为您提供足够的详细信息。