windows程式設計(24):再談多線程

來源:互聯網
上載者:User

轉自:http://blog.csdn.net/thefutureisour/article/details/8243665

之前說的實在是太膚淺了,現在有了一點心的認識,就多說幾句。

首先,為什麼要搞多線程?除了線程間通訊方便之外,還有一個重要的原因是線程可以被分配時間片,這樣,假如一個程式有很複雜的任務要執行,需要花很長時間,那麼我們可以將它寫成一個多線程的,讓它有多次機會被CPU“臨幸”到,所以多線程程式運行起來,感覺CPU的佔有率特別高。

當然,線程之間的同步是一個非常關鍵的因素,因為CPU的時鐘一到,就切換走了,是按照一條機器指令執行完就切換的,並不是一行C語句之類的;假如線程1向一個變數裡存了一個值,下面會使用它,但是使用之前切換到另一個線程2,線程2向其中重新寫了一個值,那麼等下一次線程1再去讀裡面的值時,就會發生了變化。所以,對於多個線程共用變數,一定要同步機制保護起來。

程式員經常使用的同步機制是關鍵程式碼片段,它的作用如下:每個進程在訪問共用變數前,先進入關鍵程式碼片段,如果能進入,那麼在裡面完成對共用變數的操作,如果不能進入關鍵程式碼片段,則原地等待。如果期間CPU切換到另一個線程,那麼它在訪問共用變數前,也要進入關鍵程式碼片段才能繼續,但是由於前一個線程在關鍵程式碼片段中,還沒有出來,所以他進不去,自然也就無法訪問共用變數了。直到前一個線程退出關鍵程式碼片段後,後一個線程才有機會訪問共用代碼。對於那些並沒有使用關鍵程式碼片段保護的操作,依然是正常的執行,不受影響。

說白了,關鍵程式碼片段保護的,不是某個被共用的變數,而是讀寫變數的動作!所以在程式中,如果有多個線程都要訪問一個共用的變數,那麼它們都要在訪問共用變數前加上與關鍵程式碼片段相關的代碼。

在程式的設計時,關鍵程式碼片段所保護的操作應該越少越好,因為多線程的目的是為了讓程式“並發”執行,(對於單核CPU,是更多的時間片“臨幸”到一個進程的多個線程上),但是如果有一個線程中關鍵程式碼片段所保護的操作要執行很長時間,那麼其他線程如果也有訪問關鍵程式碼片段的操作,就只能乾等著。這也就違背了多線程的本意了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.