我來談一談執行緒

2021-05-27 02:40:02 字數 2359 閱讀 6217

我堅信每個程式設計師都有被執行緒折磨得死去活來的經歷,我也是!為了解決乙個問題,我愣是弄了兩天,發帖求助,但是最終也沒有解決!沒有辦法只有自己動手,豐衣足食!

上面是一點廢話,其實,執行緒我也沒有弄透徹,今天只是寫一寫其兩個屬性,terminated, suspended,不要小看這兩個屬性,它們確實管理tthread子類的重要開關。下面開始正題:

1. 簡單介紹suspended、terminated。

suspended:這個屬性我們在建構函式中見到,建立乙個繼承自tthread的類的物件的時候,我們往往會考慮,這個類要不要先suspend,設定完相關屬性之後,我們再喚醒resume。其他的時候,好像也沒怎麼關注(ps:當然作為熟練掌握執行緒的人來說,看到我說這句話肯定會鄙視我:只有你自己沒有關注而已吧 ...我承認!),但是這個屬性相當的重要?為什麼?且看下面介紹termianted。

terminated:首先說明這是乙個唯讀的屬性,而且在tthread中是公布在protected中,因此,當乙個繼承自tthread的子類被當做另外乙個類的類變數的時候,我們就無法訪問了這個屬性了,不過沒有關係啊,我們完全可以在tthread的繼承類中public一下,這樣會不會破壞封裝性?安全性?個人覺得,作為乙個唯讀屬性,這個應當無大礙!這個屬性值為true的時候,suspended也會置為true。乙個執行緒被標記為terminated的時候,這個執行緒也就標誌著廢了,要想跑起來(execute裡面的**),這時候應該這樣做:做好這個執行緒的收尾工作,對於收尾工作,可以這樣做:在建立執行緒物件的時候,設定freeonterminate這個屬性值為true,另外如果在收尾的時候想跟主線程互動的話,那麼可以寫乙個跟tnotifyevent格式相同的方法,將方法指標賦值給onterminate,同時,如果在建立執行緒物件的時候顯式的建立了物件,那麼可以將這部分放到執行緒類的析構中,這樣一般就沒有什麼問題了,用fastmm檢測,就不應該有記憶體洩露了,做完收尾工作之後,就建立新的執行緒物件,並讓其處於喚醒狀態,這樣執行緒物件就會正常的工作了。

2.終止執行緒的時候呼叫類似 athread.terminate就萬事大吉?    其實不是的。舉乙個例子 

athread := asamplethread.create(true);

athread.terminate;

這樣是有問題的!原因在於athread.suspended = true; 乙個執行緒如果處在suspended的狀態的時候,呼叫terminate就會出問題。那麼這種情況怎麼辦呢?我的解決辦法有點暴力,不過或許只能這樣做吧:

if assigned(fthread) and (not fthread.terminated) then

begin

if fthread.suspended then

fthread.resume;

fthread.terminate;

end;

3  freeonterminate在釋放執行緒資源的時候,真的只是free沒有nil!

如果你的類a中有乙個執行緒類變數(atrhead),而且athread的freeonterminate設定為true,在析構你的類的時候,你特別的加上一句freeandnil(athread),那麼這時候系統會提示你嘗試修改已經釋放的記憶體,原因就是freeonterminate做的工作是free而不是freeandnil,呼叫兩遍freeandnil當然沒有問題,但是呼叫兩次free就是有問題的,那麼在什麼地方設定athread := nil呢?可以放在賦值給onterminate的函式中,這樣就真的安全了。

4. 如果執行緒物件的execute執行完成之後,執行緒物件的狀態是怎樣的呢?

suspended = terminated = true.其實不嚴格的話,也可以說成執行緒sleep了,不過這個sleep是無法喚醒的,因為該執行緒物件被終結了!所以,這樣看來,由於suspended是乙個可寫可讀的變數,因此,你有可能這樣賦值 athread.suspended := false;或者athread.resume.但是如果athread的terminated為true,那麼這樣做肯定是有問題的,那麼可以這樣寫:

if not fthread.terminated then

begin

fthread.suspended := not fthread.suspended;

end;

或者:
if (not fthread.terminated) and (fthread.suspended) then
fthread.resume;

談一談執行緒池

1 執行緒池是什麼?執行緒池是建立若干個可以執行的執行緒並把它們管理起來,如果有任務需要執行就讓某乙個空閒的執行緒去執行任務,任務執行完成之後掛起執行緒等待喚醒。2 為什麼需要執行緒池?執行緒的建立和銷魂都是需要呼叫作業系統api為其分配資源,成本高和開銷大,為了避免頻繁的建立和銷毀增加的開銷就需要...

靜下心來談一談

又看了一些站內外的blogger的文章,發現有人息事寧人了,有人選擇離開了,有人強調blogger要和bsp團結。對這些人和文章,我沒有反對的意思,那是每個人面對問題的真實想法,無可厚非,何況這些人裡還有我很高興認識的人。只是覺得離開是被動的逃避,不管說的怎麼有道理,是逃避就要承認。也許你會說這是我...

談一談教育

今晚和研究生的師兄聊了會天,突然就說到教育的問題,有點感想,就寫下來,算是我對中國教育的一點看法吧。毫無疑問,中國的教育體制存在不少問題。在高中的時候或許還不是那麼明顯 對比起大學來說 上了大學,我才看清了我們教育的一些弊端。我覺得,最大的弊端,在於價值觀的引導問題上。不知道大家有沒和我一樣覺得當今...