臨界區、互斥、信號量

引言

臨界區、互斥、信號量都是在併發運行中,對資源的訪問進行控制的方式。在本文中,資源即爲代碼。

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運行;
}


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