線程的基本概念、線程的基本狀態及狀態之間的關係?
http://blog.csdn.net/bornlili/article/details/55805732
線程是進程的一個順序執行流。
線程是進程中的一個執行控制單元,執行路徑。
一個進程中如果只有一個執行路徑,這個程序稱爲單線程
一個進程中有多個執行路徑時,這個程序成爲多線程
新建態、就緒態、運行態、阻塞態、掛起態、結束態
線程與進程的區別
1、進程是系統分配資源的基本單位,線程是系統調度的基本單位
2、一個進程包含多個線程,一個線程必須隸屬於一個進程,同一個進程中的線程共享資源:打開文件,地址空間,套接字,內核對象
3、線程間切換代價小,進程間切換代價大,
4、進程間通信沒有線程間通信方便
5、進程有獨立的地址空間,線程共用同一個地址空間
同步和互斥有何區別
同步,又稱直接制約關係,是指多個線程(或進程)爲了合作完成任務,必須嚴格按照規定的某種先後次序來運行。
互斥,又稱間接制約關係,是指系統中的某些共享資源,一次只允許一個線程訪問。當一個線程正在訪問該臨界資源時,其它線程必須等待。
同步包含互斥。
多線程同步和互斥有幾種實現方法,都是什麼?
互斥量
讀寫鎖
臨界區
信號量
條件變量
事件
哪些方法只能用於互斥?
關鍵段和互斥鎖不能用於線程同步,因爲它們都有線程所有權。
會記錄當前線程的ID,並與嘗試執行操作的線程ID進行比較。如果ID不相同則會拒絕執行。
關鍵段與互斥量的區別?
互斥量是內核對象,關鍵段是普通數據結構。
互斥量是內核對象,可以通過命名內核對象實現跨進程互斥。
關鍵段不是內核對象,其底層實現細節是一個數據結構,內含事件內核對象。所以關鍵段只能用於同一進程內的線程互斥。
由於互斥量是內核對象,每次使用都需要陷入內核態,開銷大。
如果只爲了在進程內部是用的話使用臨界區會帶來速度上的優勢並能夠減少資源佔用量。
關鍵段如何使用,有何注意事項?
關鍵段包含四個函數:初始化,銷燬,進入,離開
使用關鍵段前必須先執行初始化函數,所有線程結束關鍵段使用後需要執行銷燬函數。
多次調用進入函數時,需要多次調用離開函數。
如果進入關鍵段失敗,會使用一個事件內核對象把調用線程切換到等待狀態。這意味着線程會切換到內核模式,開銷非常大,在多處理器機器上,爲了提高性能,可以配合旋轉鎖,嘗試在一段時間內獲得對資源的訪問權,只有當嘗試失敗時才切換到內核模式進入等待狀態。
讀寫鎖使用注意事項
包含五個函數:初始化函數,獲取讀鎖,釋放讀鎖,獲取寫鎖,釋放寫鎖。沒有銷燬函數
與臨界區不同,讀鎖不能遞歸地獲得,一個線程不能爲了多次寫入資源而多次鎖定資源。
條件變量和二元信號量的區別
信號量的遞增和減少會被記錄下來,不必擔心會丟失。
而喚醒一個條件變量,如果沒有相應的線程在等待該條件變量,這次喚醒將被丟失。
以下多線程對int型變量x的操作,哪個不需要進行同步()
A.++x 、B.x=y 、C.++ 、D.x=1
解析:
類似x++, x+=2, ++x這樣的操作在多線程環境下是需要同步的。因爲X86會按三條指令的形式來處理這種語句:從內存中讀x的值到寄存器中,對寄存器加1,再把新值寫回x所處的內存地址。
x=y 在X86上它包含兩個操作:讀取y至寄存器,再把該值寫入x。
x=1 只需將1寫入內存一條指令,屬於原子操作,因此不需要同步。
一個全局變量tally,兩個線程併發執行(代碼段都是ThreadProc),問兩個線程都結束後,tally取值範圍。
inttally = 0;//glable
voidThreadProc()
{
for(inti = 1;i <= 50;i++)
tally += 1;
}
答:[50,100]