【问题标题】:Can someone Explain Mutex and how it is used?有人可以解释 Mutex 以及它是如何使用的吗?
【发布时间】:2011-04-01 12:41:21
【问题描述】:

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

我从 Code sn-p 得到并执行,效果很好:

#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");

}

但我不明白的是线程在哪里,共享资源在哪里?谁能解释或提供更好的文章或文件?

【问题讨论】:

  • 您的代码 sn-p 似乎不完整,例如我看不到 FunctionToWriteToDatabase 的调用位置。你能提供更多吗?你从哪里得到的?如果您澄清您的问题是关于一般互斥锁还是此特定代码 sn-p,这也会有所帮助。

标签: c++ windows multithreading mutex


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    msdn 中的这个link 提供了一个与您在 main() 函数中创建的线程类似的示例。但同样不包括应该是数据库的共享资源。
    无论如何,共享资源是需要从多个线程访问的任何内容:设置文件、驱动程序、数据库......

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

    【讨论】:

      【解决方案3】:

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

      如果您想了解 Mutex 的具体信息,那么维基百科将为您提供足够的详细信息。

      【讨论】:

        【解决方案4】:

        也许它会是你最好的来源

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

        【讨论】:

          猜你喜欢
          • 2012-07-27
          • 2012-06-27
          • 1970-01-01
          • 2011-12-26
          • 2018-11-26
          • 1970-01-01
          • 2011-07-28
          • 2011-03-08
          • 2020-04-20
          相关资源
          最近更新 更多