學習用互斥物件實現執行緒同步

2021-05-10 21:35:56 字數 1703 閱讀 8095

前段時間要做個多執行緒資料共享的例子。多執行緒之間用過不少,資料同步,是第一次做。

之前看書的時候看到很多這方面的說明,感覺很複雜,一直沒去深入。這次要做這個應用了,遇上不少問題。

一開始就是看不懂網上的教程,看了之後,發現人家講了很多,自己看了,似乎看懂了又沒看懂。

嫌麻煩就嘗試用乙個全域性變數來做「忙標誌」,要運算元據的執行緒先把標誌置「忙」,操作完之後恢復為「閒」。其它執行緒看到忙標誌就暫停,空跑。

在windows2003寫完**後運氣起來「感覺沒問題」,而在xp系統下一下子就崩潰了。

多執行緒的**除錯下來非常麻煩,我也是不懂在delphi環境下該如何調。

後來經過一番摸索,發現用互斥物件來做相對簡單些,看了教程加自己摸索了一陣,終於弄懂了,但也不知道懂得對不對。望大家指正。

舉個例子而言,

有兩個子執行緒,都是要對同乙個全域性資料buffer進行操作(有寫有讀),應該怎樣避免資料訪問衝突呢?

1.全域性變數宣告。

const

mutex_data : string = 'p1p2p3c1c2data';

varhmutexdata: thandle = invalid_handle_value;

2.在你的主線程(系統為程式預設建立的第乙個執行緒)建立子執行緒之前,初始化互斥物件。

hmutexdata := createmutex(nil, false, pchar(mutex_data));

該函式的使用請參閱其它資料,注意第二個引數要為false,表示建立的時候不「開啟」這個互斥量。

3.在各個執行緒要操作全域性資料buffer(或寫或讀)前等待,請求互斥量。

waitforsingleobject(hmutexdata, infinite);

infinite表示無限等待。如果當前互斥量處於「空閒」狀態,則把互斥物件搶占過來,然後往下執行下面的**。

如果互斥量處於「非空閒」狀態,則一直等待到「空閒」才往下執行**。該方式不占用cpu時間。好像是跟windows事件機制有關。

把互斥物件搶占過來之後,別的執行緒就無法取得互斥物件,要等你當前這段**執行完畢。

4.在主線程退出前,釋放互斥物件。

releasemutex(hmutexdata);

說起來,這個過程跟我一開始想的拿個全域性變數來做「忙標誌」的原理很接近,可為什麼我那個方法不行。。。可能沒處理好吧。。。懶,沒深究。。。

要補充兩點:

1.上面講的是同步乙個全域性資料,其實如果多個執行緒訪問同乙個窗體或同乙個控制項時,也可以使用這樣的方法。它們也是全域性資料的一種。

2.上面的第三步加「等待互斥物件」的**究竟加在**是有講究的。

同乙個執行緒最好只等待乙個互斥物件(可以有多個互斥物件)。如果在乙個執行緒中多次呼叫waitforsingleobject(hmutexdata, infinite),那麼你就要處理好**執行順序的問題,否則很容易死鎖。寧願多建立幾個互斥物件,如不同的**不同的互斥物件。

如:waitforsingleobject(hmutexdata111, infinite);

waitforsingleobject(hmutexdata222, infinite);

waitforsingleobject(hmutexdata333, infinite);

互斥物件用起來其實很簡單。就是沒被點透。

希望這篇文章能幫到你。如果我的理解,用法有問題,也希望你能指正一下,不勝感激。

原創溫校巨集

2009/11/15

使用互斥物件實現執行緒同步

使用互斥物件實現執行緒同步 互斥物件屬於系統核心物件,它能夠使執行緒擁有對某個資源的絕對訪問權。互斥物件主要包含使用 數量,執行緒id和遞迴計數器等資訊。其中執行緒id表示當前擁有互斥物件的執行緒,遞迴計數器表示執行緒 擁有互斥物件的次數。互斥物件的使用方式 當互斥物件的執行緒id為0時,表示互斥物...

利用互斥物件實現執行緒同步

程式是計算機指令的集合,它以檔案的形式儲存在磁碟上。而程序通常被定義為乙個正在執行的程式的例項,是乙個程式在其自身的位址空間中的一次執行活動 程序從來不執行任何東西,真正完成 執行的是執行緒,而程序只是執行緒的容器,或者說是執行緒的執行環境 當建立乙個程序時,作業系統會自動建立這個程序的第乙個執行緒...

利用互斥物件實現執行緒同步

mutex 屬於核心物件,能夠保證執行緒對單個資源的互斥訪問權。建立互斥物件需要呼叫的函式,createmutex handle winapi createmutex lpsecurity attributes lpmutexattributes 指向security attributes 結構的指...