多進程,多線程在 Window 和 Unix 下的通信,同步與互斥

        Window 環境:

1. 多進程通信:匿名管道,命名管道,共享內存,文件映射,郵件槽,剪貼板,動態數據交換,對象連接和嵌入,動態連接庫,遠程過程調用,NetBios函數,Sockets, WM_COPYDATA消息。

參考: http://www.cnblogs.com/erwin/archive/2007/04/16/715084.html

2. 多線程通信方式:同一進程時,可用全局變量;通過線程句柄發送消息(不同進程的同一線程句柄值是否表示同一個線程)。

3. 多線程同步:事件,信號量,互斥量(也可用於多進程),臨界區間,互鎖訪問(原子訪問)。

參考:http://www.kuqin.com/windows/20070908/943.html

  • 3.1. 事件(Event)
  1. 事件處於激發狀態(signaled or true)或未激發狀態(unsignaled or false)。
  2. 根據狀態變遷方式,事件分爲 手動設置(SetEvent 和 ResetEvent 來設置狀態)和自動設置    (事件處理後,自動回覆到沒有時間狀態)。
  3. 創建事件函數:CreateEvent,返回事件句柄,參數包括狀態設置方式,初始狀態,事件名稱。
  4. event 對象屬於內核對象,所以進程 B 可通過事件名調用進程 A 中 event 對象的句柄(OpenEvent)。這個句柄用於 ResetEvent,SetEvent,WaitForMultipleObjects 函數中。
  • 3.2. 臨界區(Critical section)

   1.定義臨界區變量 CRITICAL_SECTION gCriticalSection;

   2.Critical Section 不是 OS 核心對象,不能跨進程,如果進入臨界區的線程“掛”了,將無法釋放臨界資源。這個缺點在 Mutex 中得到了彌補。 

 函數功能  函數名
 初始化臨界區  initializeCriticalSection;
 刪除臨界區  DeleteCriticalSection
 進入臨界區   EnterCriticalSection
 離開臨界區  LeaveCriticalSection
 臨界區使用方法:

 void UpdateData()
{
 EnterCriticalSection(&gCriticalSection);
 ...//do something
 LeaveCriticalSection(&gCriticalSection);
}

 

  • 3.3.互斥量(mutex)

   互斥(Mutex)內核對象能夠確保線程擁有對單個資源的互斥訪問權。

   1.Mutex 是核心對象,可以跨進程訪問。 

 

 函數功能  函數名
 創建  CreateMutex
   
   

 

   互斥對象的行爲特徵與臨界區相同,但是互斥對象屬於內核對象,而臨界區則屬於用戶方式對象,因此導致Mutex 與 Critical Section 的如下不同

多進程,多線程在 <wbr>Window <wbr>和 <wbr>Unix <wbr>下的通信,同步與互斥

  3.4.信號量(Semaphore)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章