程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 進程/線程間同步

進程/線程間同步

編輯:關於C語言

 

  因為進程/線程間同步的方法比較多,每種方法都有不同的用途:這節中會講通過臨界區,互斥量,信號燈,事件來進行同步。

  由於進程/線程間的操作是並行進行的,所以就產生了一個數據的問題同步,我們先看一段代碼:

int iCounter=0;//全局變量
DOWRD threadA(void* pD)
{
         for(int i=0;i<100;i++)
         {
                 int iCopy=iCounter;
                 //Sleep(1000);
                 iCopy++;
                 //Sleep(1000);
                 iCounter=iCopy;
         }
}

現在假設有兩個線程threadA1和threadA2在同時運行那麼運行結束後iCounter的值會是多少,是200嗎?不是的,如果我們將Sleep(1000)前的注釋去掉後我們會很容易明白這個問題,因為在iCounter的值被正確修改前它可能已經被其他的線程修改了。這個例子是一個將機器代碼操作放大的例子,因為在CPU內部也會經歷數據讀/寫的過程,而在線程執行的過程中線程可能被中斷而讓其他線程執行。變量iCounter在被第一個線程修改後,寫回內存前如果它又被第二個線程讀取,然後才被第一個線程寫回,那麼第二個線程讀取的其實是錯誤的數據,這種情況就稱為髒讀(dirty read)。這個例子同樣可以推廣到對文件,資源的使用上。

那麼要如何才能避免這一問題呢,假設我們在使用iCounter前向其他線程詢問一下:有誰在用嗎?如果沒被使用則可以立即對該變量進行操作,否則等其他線程使用完後再使用,而且在自己得到該變量的控制權後其他線程將不能使用這一變量,直到自己也使用完並釋放為止。經過修改的偽代碼如下:

int iCounter=0;//全局變量
DOWRD threadA(void* pD)
{
         for(int i=0;i<100;i++)
         {
                 ask to lock iCounter
                 wait other thread release the lock
                 lock successful
                 

							
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved