轉自:http://blog.csdn.net/thefutureisour/article/details/8243665
之前說的實在是太膚淺了,現在有了一點心的認識,就多說幾句。
首先,為什麼要搞多線程?除了線程間通訊方便之外,還有一個重要的原因是線程可以被分配時間片,這樣,假如一個程式有很複雜的任務要執行,需要花很長時間,那麼我們可以將它寫成一個多線程的,讓它有多次機會被CPU“臨幸”到,所以多線程程式運行起來,感覺CPU的佔有率特別高。
當然,線程之間的同步是一個非常關鍵的因素,因為CPU的時鐘一到,就切換走了,是按照一條機器指令執行完就切換的,並不是一行C語句之類的;假如線程1向一個變數裡存了一個值,下面會使用它,但是使用之前切換到另一個線程2,線程2向其中重新寫了一個值,那麼等下一次線程1再去讀裡面的值時,就會發生了變化。所以,對於多個線程共用變數,一定要同步機制保護起來。
程式員經常使用的同步機制是關鍵程式碼片段,它的作用如下:每個進程在訪問共用變數前,先進入關鍵程式碼片段,如果能進入,那麼在裡面完成對共用變數的操作,如果不能進入關鍵程式碼片段,則原地等待。如果期間CPU切換到另一個線程,那麼它在訪問共用變數前,也要進入關鍵程式碼片段才能繼續,但是由於前一個線程在關鍵程式碼片段中,還沒有出來,所以他進不去,自然也就無法訪問共用變數了。直到前一個線程退出關鍵程式碼片段後,後一個線程才有機會訪問共用代碼。對於那些並沒有使用關鍵程式碼片段保護的操作,依然是正常的執行,不受影響。
說白了,關鍵程式碼片段保護的,不是某個被共用的變數,而是讀寫變數的動作!所以在程式中,如果有多個線程都要訪問一個共用的變數,那麼它們都要在訪問共用變數前加上與關鍵程式碼片段相關的代碼。
在程式的設計時,關鍵程式碼片段所保護的操作應該越少越好,因為多線程的目的是為了讓程式“並發”執行,(對於單核CPU,是更多的時間片“臨幸”到一個進程的多個線程上),但是如果有一個線程中關鍵程式碼片段所保護的操作要執行很長時間,那麼其他線程如果也有訪問關鍵程式碼片段的操作,就只能乾等著。這也就違背了多線程的本意了。