信號量
信號量一般用於資源的訪問控制和代碼段的執行控制
其本質是一個計數器。信號量是在多線程環境下實現資源互斥訪問或共享資源訪問的方法,可以用來保證兩個或多個關鍵代碼段不被並發調用。在進入一個關鍵代碼段之前,進程/線程必須獲取一個信號量,一旦該關鍵代碼段完成了,那么該進程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個進程釋放信號量。
為了完成這個過程,需要創建一個信號量VI,然后將 Acquire Semaphore VI (獲取信號量)以及 Release Semaphore VI (釋放信號量)分別放置在每個關鍵代碼段的首末端,確認這些信號量VI引用的是初始創建的信號量。
可以與共享內存結合使用實現最快的進程間通訊
消息隊列
消息隊列一般用於進程間或者線程間通信(數據傳遞)
消息隊列本質是一個消息的鏈表,每個消息隊列有一個隊列頭在用戶態創建的時候生成,這個隊列頭描述了消息隊列的key值,用戶ID,組ID等信息,但它存於內核中,用戶態程序通過消息結構體實現消息的寫入和取出。
消息是按消息類型(type)訪問,進程必須指定消息類型來讀取消息,同樣,當向消息隊列中寫入消息時也必須給出消息的類型,如果讀隊列使用的消息類型為0,則讀取隊列中的第一條消息。使用的時候調用msgsnd函數向鏈表push數據和msgrcv函數pop函數從鏈表取出數據(並刪除當前數據)
文件鎖
用於訪問數據文件時的控制
文件鎖本質是通過信號量控制read、write函數的調用來實現對文件的讀寫控制,讀鎖稱為共享鎖、寫鎖稱為互斥鎖,
共享鎖之間互不干擾:可以有多個進程或者線程對文件進行“讀”操作、但是不可以進行“寫”操作
互斥鎖之間互相制約:一個文件如果被線程加了互斥鎖,只有當前線程可以進行“寫”操作,別的線程既不可以進行“寫”操作、也不可以進行“讀”操作
互斥鎖是用來保證多線程互斥的,比如,一個線程占用了某一個資源,那么別的線程就無法訪問,直到這個線程離開,其他線程才開始可以利用這個資源,用來保證一段時間內只有一個線程在訪問同一資源。
總結:
信號量和文件鎖功能類似,都是為了保證一個資源(文件、代碼段、共享內存)在同一時間只有一個線程訪問;
消息隊列和全局字符串功能類似,都是為了多線程或者多進程通信(傳輸數據)使用,同時數據的排列結構、寫入消息、取出消息參考鏈表的特性