close
上次透過platform sdk介紹windows的event
今天則介紹其他的其他的同步物件
mutex,semaphore,critical section


先簡單的介紹
mutex的用途是讓同一個資源 同一時間內只能有一個執行緒可以使用他
這是最實用的 因為在多執行緒程式中我們常需要保護某個變數或者資源同時只有一個執行緒能使用
semaphore則算是mutex的擴充版 他可以讓我們控制同時能有多少執行緒可以進入
mutex只能有一個 而semaphore則可以讓我們決定可以多少個
critical section則是mutex的快速版 他的執行速度比mutex快 
但是缺點是只能在同一個行程內使用(簡單的說 就是只能在同一個程式內)
因為critical section並沒有開啟一個handle而是使用一個structure

以下開始示範如何使用這些物件
首先是mutex
volatile DWORD g_Counter = 0;

HANDLE g_Mutex = ::CreateMutex(NULL,FALSE,"MY_MUTEX");

void AddOne()
{
  ::WaitForSingleObject(g_Mutex,INFINITE);
  g_Counter++;
  ::ReleaseMutex(g_Mutex);
}
CreateMutex()的第一個參數是安全設定通常不用管他傳NULL即可
第二個參數 TRUE代表初始狀態被這個執行緒占住 
則其他執行緒在WaitForSingleObject()時 便會停住 
第三個參數是我們給這個物件的名字 用來開啟用的 用法跟前面event類似 故不多介紹
在AddOne()中 使用
WaitForSingleObject()等待mutex被釋放
釋放之後 WaitForSingleObject()便可繼續並且佔據這個mutex使其他執行緒不能進來
最後在我們要處理的事項完成後 要使用ReleaseMutex()讓其他執行緒可以進來

接下來是critical section
volatile DWORD g_Counter = 0;

CRITICAL_SECTION g_CS;
void Initialize()
{
  ::InitializeCriticalSection(&g_CS);
}

void AddOne()
{
  ::EnterCriticalSection(&g_CS); 
  g_Counter++;
  ::LeaveCriticalSection(&g_CS); 
}
我們要宣告一個CRITICAL_SECTION結構的參數
要使用之前 要先用InitializeCriticalSection()來做初始化
接下來用EnterCriticalSection()跟LeaveCriticalSection()
將我們要保護的區塊包住 如此保護中間的區塊同時只會有一個執行緒能使用

最後是semaphore
volatile DWORD g_Counter = 0;

//MAX_RES為所有的資源數目 也是最多可進入的執行緒數目
HANDLE g_Semaphore = ::CreateSemaphore(NULL,0,MAX_RES,"MY_SEM");

void AddOne()
{
  ::WaitForSingleObject(g_Semaphore,INFINITE);

// 要處裡的事項放這裡 同時能進來的執行緒不會超過MAX_RES個
  ::ReleaseSemaphore(g_Semaphore);
}
semaphore可用CreateSemaphore()來取得
第一個參數為安全設定 可以不用管他
第二個是已使用資源數的初始值 這個值應該介於0與最大值中間
第三個可使用資源的最大值
第四個是我們給的名字 讓其他行程可以開啟
使用方法跟其他一樣 
也是用
WaitForSingleObject()跟ReleaseSemaphore()將要保護的區塊包起來


from:
http://blog.yam.com/swwuyam/article/11459124
arrow
arrow
    全站熱搜

    天才R 發表在 痞客邦 留言(0) 人氣()