引言
臨界區、互斥、信號量都是在併發運行中,對資源的訪問進行控制的方式。在本文中,資源即爲代碼。
1、臨界區
臨界區即獨佔式資源,在多線程中,有且只有一個線程可以訪問臨界區。
例1:多個線程做同樣的一件事:打印文件a。
定義臨界區;
初始化臨界區;
線程A
{
進入臨界區;//若無法進入,則表示已有其它線程進入臨界區
打印機打印文件a;//打印機不能同時打印兩份文件,所以置於臨界區
離開臨界區;
}
主程序
{
線程A A1;
線程A A2;
線程A1運行;
線程A2運行;
等線程A1、A2均運行結束,釋放臨界區;
}
例2:多個線程打印不同的文件。
定義臨界區;
初始化臨界區;
線程A
{
進入臨界區;//若無法進入,則表示已有其它線程進入臨界區
打印機打印文件a;//打印機不能同時打印兩份文件,所以置於臨界區
離開臨界區;
}
線程B
{
進入臨界區;//若無法進入,則表示已有其它線程進入臨界區
打印機打印文件b;//打印機不能同時打印兩份文件,所以置於臨界區
離開臨界區;
}
主程序
{
線程A A1;
線程B B1;
線程A1運行;
線程B1運行;
等線程A1、B1均運行結束,釋放臨界區;
}
2、互斥
互斥的使用方法與臨界區基本一致,區別在於適用範圍。互斥適用於不同應用程序之間的資源訪問控制,臨界區適用於當前應用程序中不同線程之間的資源訪問控制。最好不要將互斥應用於單個應用程序中,它的執行速度較臨界區要慢。
3、信號量
信號量適用於多線程對一定數量的資源的訪問控制。
例:2個取票口,5個線程模擬取票。
信號量 signal = 2;//意爲2個取票口
線程A
{
等待信號量;//大致解釋爲下列代碼
// while(signal<=0);//若signal小於等於0,需等待別處“釋放信號量”
// signal--;
取票;
釋放信號量;//大致解釋爲下列代碼
// signal++;
}
主程序
{
//定義5個線程,模擬5個人取票,但只有2個取票口的情景
線程A A1;
線程A A2;
線程A A3;
線程A A4;
線程A A5;
線程A1運行;
線程A2運行;
線程A3運行;
線程A4運行;
線程A5運行;
}