[C++]遇到非Thread-Safety操作的問題與解決

Thread-safety的定義,在Wiki上這樣寫:
Thread safety is a computer programming concept applicable in the context of multi-threaded programs. A piece of code is thread-safe if it only manipulates shared data structures in a manner that guarantees safe execution by multiple threads at the same time. There are various strategies for making thread-safe data structures.

簡單來說,一段code要被稱作是"thread-safe",那就表示在多個thread下,共用同一共享區塊時,還能保證安全,不會動不動crash的情況。

我的API就是在頻繁的操作共用的list或是vector時,在不同的電腦,會發生不定期的crash狀態。因為是API,所以很難發現,總認為可能是AP的因素比較大,到最近才發現這個bug。其實這是不能犯的小錯誤,就在當初沒有注意到。

結構大概是這樣:

  • List queue - 一個list的結構
  • Thread A - 持續不斷的對queue塞值
  • Thread B - 持續不斷的對queue取值

我寫一個簡單小程式,list queue就宣告成int的queue,thread A和B依序開啟沒有delay,且兩個thread在取值或塞值時,也沒有任何delay,並把結果顯示在螢幕上。一執行的結果,就可以看到馬上crash,這真是一點都不safe。

解決方法也很簡單,加上共用限制就好了。可以用我先前寫過的Event控制,我裡頭再放了兩種控制方法:

  • critical section
  • mutex

大概意思是說,確保了同時間只有一個thread可以動作,不管是寫值或是取值。只要搶得先機的thread,就把門關上,等做完事情之後再開起來讓大家再來搶。

--程式執行圖--


按下go之後,同時顯示塞進queue的數量和取出queue的數量。喔對,還有做一件事情,因為dialog裡頭開啟的thread,不能直接對dialog上的元件做值更新的動作(UpdateData),所以得另外透過message的方式,所以thread送出一個自訂的message,通知message機制去做更新動作。且因為顯示在螢幕上,又加上互斥條件,所以慢的多,一秒約2.3千個int被塞或取。如果沒有這些限制,大約一秒可以塞30萬個呢!

--完整Source Code(VC++ 2008 vaildated)
testMutexUI.7z

0 意見:

搜尋此網誌

總網頁瀏覽量

TK呱呱

Made with by TK