2010-08-20 281 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,驅動程序,數據庫,...

你要知道的是,雖然該互斥鎖保護的例子中的計數器寫的,而它是在沒有被保護的情況下被閱讀。而在這種情況下,可能沒有問題,這是有點草率。

相關問題