如何殺掉無回應的 Thread ? |
缺席
|
robowang
一般會員 發表:2 回覆:6 積分:6 註冊:2003-06-04 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: 我一個程式開啟數百個執行緒,但執行緒數量一多, 就很容易造成部份執行緒停止回應(死掉了) 那些執行緒執行的程式並沒有出錯, 但執行緒就是沒有分配到 CPU 時間 似乎作業系統已經忘了它們的存在 我想把那些死掉的執行緒給殺掉, 但不知哪個指令可以安全殺掉 dead thread, 同時釋放該執行緒所佔用的資源 ? 請問有誰知道嗎 ?幾百個 THREAD ? .... 那果然是會出問題.... 在 DELPHI 的 HELP 中就有下列這一段... Following are issues and recommendations to be aware of when using threads: Keeping track of too many threads consumes CPU time; the recommended limit is 16 threads per process on single processor systems. 你的問題就如果 WILLIAM 講的用 TerminateThread 應該可以解決. 不過根本之道應該是檢視程式的流程及寫法. 應該是不用開這麼多個 THREAD 來處理才對!! ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com |
robowang
一般會員 發表:2 回覆:6 積分:6 註冊:2003-06-04 發送簡訊給我 |
|
robowang
一般會員 發表:2 回覆:6 積分:6 註冊:2003-06-04 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: 多謝 ! 我知道 TerminateThread 指令, 也試過 但 TerminateThread 並不"安全", 會造成程式出錯, 因此我希望能有一種"安全"的方法 可以殺掉 Thread, 又可以釋放資源 當程式使用 ExitProcess 結束時, 那些 dead thread 也會被清除, 所佔用的資源也會被釋放 因此我想或許有某一個指令可以清除某一個 Thread, 並釋放它的資源, 只是不曉得是什麼指令而已 有人知道嗎 ?Thread 的指令就這麼幾個. 要由外部去刪除, 一定是會留點東西下來, 因為不是正常結束呀!! 最好的做法應該還是由自己的程式內部控制什麼時候產生, 什麼時候結束. 在自己的程式中應該是不要用到類似 TerminateThread 這種東西. 在正常的狀況下, Thread 也不是那樣容易就掛掉的, 會掛掉多少都和處理方式有關, 事前的規畫應可避免!! 另外個人資料不對, 可以去修改一下呀!!.... 好讓你恢復本 "性"!!.. :) ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com |
star
初階會員 發表:37 回覆:93 積分:36 註冊:2002-07-18 發送簡訊給我 |
|
robowang
一般會員 發表:2 回覆:6 積分:6 註冊:2003-06-04 發送簡訊給我 |
|
avex
初階會員 發表:19 回覆:49 積分:43 註冊:2003-03-28 發送簡訊給我 |
小弟持 aquarius 大人相同的說法, 若 memory leak 的原因是由你的程式造成, 運用各種資源去刪掉你的 thread 還是無法刪掉你的 leak. 寫程式的人本來就有義務要維持一個程式的完整性, 不單是create你要的資源, 更重要的是你的程式要很 robust, 足以應付各種狀況, 據小弟經驗, 寫 thread 最重要的就是它的離開了, 我甚至都已經創造出一個既定的模式去安全的離開, 甚至是 surprised terminated. 你也應該create 出屬於你的模式. 對於 memory leak, 解鈴還需繫鈴人. 我只能建議你 善用 try...catch ; try...finally
|
robowang
一般會員 發表:2 回覆:6 積分:6 註冊:2003-06-04 發送簡訊給我 |
似乎有一點失焦....
程式本身並沒有問題, 問題出在作業系統不再分配 CPU 時間給某一些 Thread
既然 Thread 沒有獲得 CPU 時間, 也就無法執行任何指令了,
所以什麼 try finally 或 try except 等等指令都沒有意義
如果作業系統能分配一些 CPU 時間給那些 Thread, 則一切都運作得很好
也沒有 memory leak, 也很 robust, 即使是 surprised terminated 也無妨 --- 只要OS給它CPU時間 我在想, 如果是 OS 把那些 Thread 給遺忘了, 那麼我是不是就乾脆把那些 Thread 給殺了
然後建立新的 Thread ?
雖然有 TerminateThread 可用, 但 TerminateThread 並不安全
而我發現 ExitProcess 卻可以將所有的資源釋放得一乾二淨, 即使是 Dead Thread 也會被 ExitProcess 清除
因此, Windows 一定有方法可以安全地殺掉 dead thread, 就像 ExitProcess 所做的那樣
搞不好只是乎叫一個簡單的 Windows API 就可以了, 只是我不曉得是哪一個 API
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
|
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
請參考 MSDN 的文件
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createthread.asp 最主要就是這一段
Remarks
The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2028 threads. If you reduce the default stack size, you can create more threads. However, your application will have better performance if you create one thread per processor and build queues of requests for which the application maintains the context information.
每個 Thread 吃掉 1MB 的空間, 你的機器上有多少 MEMORY 可以讓這程式用?
這肯定會造成嚴重的 SWAP 現像. 我覺得根本解決之道, 還是在減少 Thread 的使用. 就像 MSDN 建議的, 開一個 Thread 就好, 自己建個 QUEUE, 把工作逐一丟到 Thread 中做, 這樣還比較有效率. ...
------
水瓶男的blog: http://791909.blogspot.com |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: dllee 兄: 各位對不起,我也來插個嘴問個問題 請問如何判斷 ">>< face="Verdana, Arial, Helvetica"> 我的程式有讀取 CPU 的使用率,由此可以看出是否 CPU 已太忙。 另外,我的 Thread 主要是 ThreadTimer ,而我統計了每個 Thread 執行的次數及每次的執行時間,例如:一個 200ms 的 ThreadTimer 結果平均都要執行 180ms 或以上,那其他的幾乎就沒什麼執行到了,也可以去比較其他同樣是 200ms 的 ThreadTimer 執行次數,如此,我可以知道那一個 Thread 最占時間,再由那個 Thread 所做的事去找出占 CPU 時間的原因。引言: 每個 Thread 吃掉 1MB 的空間, 你的機器上有多少 MEMORY 可以讓這程式用? 這肯定會造成嚴重的 SWAP 現像. 我覺得根本解決之道, 還是在減少 Thread 的使用. 就像 MSDN 建議的, 開一個 Thread 就好, 自己建個 QUEUE, 把工作逐一丟到 Thread 中做, 這樣還比較有效率.對我的應用來說是還好,整台電腦都歸我的程式(一個單一的程式)使用,而且,我的程式就是 SHELL 了,進入 Windows 後,就只有執行我的程式,連 Explorer 都沒有執行,操作者也沒有開始按鈕、程式集、桌面等東西可以用,記憶體 512MB,這樣開 100 個執行緒應該都算還好吧 <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/07/25 22:02:27
------
http://www.ViewMove.com |
avex
初階會員 發表:19 回覆:49 積分:43 註冊:2003-03-28 發送簡訊給我 |
|
loverlin
一般會員 發表:1 回覆:35 積分:22 註冊:2002-07-15 發送簡訊給我 |
引言: Thread 分配不到 CPU 時間, 你是全憑感覺? 你如果說是在合作式多工的作業系統的話我認同~ 當然重要的是後面這句話, 反之, 沒有理由.最近幫朋友寫了一套監控系統(根據也說在 PII 450/WinXP 下跑200個鏡頭效能不會太差),也是一個鏡頭一個 Thread ,我發現在多個 Thread 時,用 Sleep 的效果也不見得好 我是用下列的方式,可以給各位參考 procedure TMyThread.Sleep(dwValue : DWORD); var dwStart : DWORD; begin dwStart = GetTickCount; while ( ( Application.Terminated <> True ) and ( Terminated <> True ) and ( bStop = False ) then begin if (GetTickCount - dwStart) >= dwValue then break; Application.ProcessMessage; Sleep(10); end; end; 呼叫 MySleep(10000) 或比呼叫 Sleep(10000) 來的效能更有利用到 也不會造成主畫面(GUI)停頓 kk-boy
------
kk-boy |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |