2010-08-20 274 views
6

我阅读了一些关于Mutex的文档,但仍然唯一的想法是它有助于防止线程访问已被另一个资源使用的资源。有人可以解释互斥体以及它如何使用?

我从代码片段,并得到了执行工作正常:

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

} 

但哪一个线程,这里是共享资源是什么我不明白的是什么?任何人都可以请解释或提供更好的文章或文件?

+1

您的程式码片段似乎不完整,例如我看不到FunctionToWriteToDatabase被调用的地方。你能提供更多,你从哪里得到它?如果你澄清了你的问题是关于一般的互斥锁还是这个特定的代码片断,这也会很有帮助。 – danio 2010-08-20 07:26:16

回答

11

互斥提供了mut ually ex对资源进行聚合访问;在你的情况下,一个数据库。程序中没有多个线程,但是可以运行程序的多个实例,这是您的互斥体所抵御的。实际上,它仍然保护着不受多于一个线程的访问,只是这些线程可以在不同的进程中。

您的代码正在创建一个,名为互斥体,它可以跨应用程序的多个实例共享。这是进程间通信的一种形式。在CreateMutex MSDN文档有大约命名互斥的其他有用的信息:

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

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

如果您正在使用的数据库本身不支持多线程访问,则只需在此处使用互斥锁。

0

msdn中的link提供了一个类似于main()函数中的线程的示例。但是,共享资源,这应该是一个数据库不包括在内。
无论如何,共享资源是需要从多个线程访问什么:settingsfiles,驱动程序,数据库,...

你要知道的是,虽然该互斥锁保护的例子中的计数器写的,而它是在没有被保护的情况下被阅读。而在这种情况下,可能没有问题,这是有点草率。

相关问题