2010-08-20 31 views
6

Tôi đọc một vài tài liệu về Mutex và vẫn là ý tưởng duy nhất tôi có được là nó giúp ngăn chặn các luồng truy cập vào tài nguyên đã được một tài nguyên khác sử dụng.Ai đó có thể giải thích Mutex và cách nó được sử dụng không?

tôi nhận được từ đoạn mã và thực thi mà hoạt động tốt:

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

} 

Nhưng gì tôi không hiểu là nơi là các chủ đề và ở đâu là tài nguyên được chia sẻ? Bất cứ ai có thể vui lòng giải thích hoặc cung cấp một bài viết hay tài liệu tốt hơn?

+1

Đoạn mã của bạn có vẻ không đầy đủ, ví dụ: Tôi không thể thấy nơi FunctionToWriteToDatabase được gọi. Bạn có thể cung cấp nhiều hơn và bạn đã lấy nó từ đâu?Nó cũng sẽ hữu ích nếu bạn làm rõ liệu câu hỏi của bạn là về mutexes nói chung hay đoạn mã đặc biệt này. – danio

Trả lời

11

Một mutex cung cấp tắt ually ex truy cập dễ dàng vào tài nguyên; trong trường hợp của bạn, một cơ sở dữ liệu. Không có nhiều luồng trong chương trình của bạn, nhưng bạn có thể có nhiều phiên bản chương trình đang chạy, đó là những gì mà mutex của bạn đang bảo vệ chống lại. Có hiệu quả, nó vẫn đang bảo vệ chống truy cập từ nhiều hơn một chủ đề, nó chỉ là những chủ đề có thể được trong các quy trình riêng biệt.

Mã của bạn đang tạo một tên là mutex có thể được chia sẻ trên nhiều phiên bản ứng dụng của bạn. Đây là một hình thức liên lạc giữa các quá trình. tài liệu MSDN trên CreateMutex có thông tin hữu ích bổ sung về mutexes tên:

Hai hay nhiều quá trình có thể gọi CreateMutex để tạo ra cùng một tên mutex. Quá trình đầu tiên thực sự tạo mutex, và tiếp theo quá trình với đầy đủ quyền truy cập quyền chỉ cần mở một xử lý để mutex hiện ...

Nhiều quá trình có thể có tay cầm của đối tượng mutex cùng, cho phép sử dụng đối tượng cho quá trình đồng bộ hóa .

Một mutex chỉ cần thiết ở đây nếu cơ sở dữ liệu bạn đang làm việc chống lại vốn không hỗ trợ truy cập đa luồng.

0

link trong msdn này cung cấp ví dụ tương tự như của bạn với các chuỗi được tạo trong hàm main(). Nhưng một lần nữa các tài nguyên được chia sẻ, được cho là một cơ sở dữ liệu không được bao gồm.
Dù sao, tài nguyên được chia sẻ là bất kỳ thứ gì cần truy cập từ nhiều chủ đề: settingsfiles, drivers, database, ...

Hãy nhớ rằng bộ đếm trong ví dụ được viết khi được bảo vệ bởi mutex, trong khi đó là được đọc trong khi không được bảo vệ. Trong trường hợp này, có lẽ không có vấn đề gì, nó hơi cẩu thả một chút.

Các vấn đề liên quan