none
產生多個Thread,執行一段時間後卻死當 RRS feed

  • 問題

  •  

    最近小弟寫了一段程式碼。

    內容敘述大概是說 一個while迴圈

    每次會新增10~200個Thread不等

    Thread[] nowThread = new Thread[count];
    for(int i = 0 ; i < count ; i++)
    { 
    nowThread[i] = new nowThread(DoWork); nowThread[i].IsBackground = true; 
    nowThread[i].Start(i); 
    } 
    


    接著DoWork內容是不斷去創建一個Bat檔後利用Process去執行

    並且讀取Bat執行的結果,直到資料夠了或是達到停止條件。

    其間我利用thesThread[i].IsAlive判斷是否結束

    接著DoWork內容是不斷去創建一個Bat檔後利用Process去執行

    並且讀取Bat執行的結果,直到資料夠了或是達到停止條件。

    其間我利用thesThread[i].IsAlive判斷是否結束

    bool AllDone = false;                
    while (!AllDone)
    {
           for (int i = 0; i < LocalTotalAnt; i++)
           {                        
                if (testThread[i].IsAlive == true)
               {
                       AllDone = false;
                       break;
                }
                else
                {
                        AllDone = true;
                }
            }                    
     }
    


    當所有Thread結束後我會將他們讀取的資料輸出成一個txt檔但是問題來了。

    常常在while迴圈在第N次的時候(N不一定 也許50 也許80)

    整個死當,此時使用單步執行想看DoWork內究竟卡在哪裡,就會整個死當,無法觀看。

    想請問各為大大,問題究竟出在哪裡?

    2011年11月10日 上午 09:38

所有回覆

  • 邏輯應該沒錯。

    可是你的讀檔,哪裡有問題嗎?


    http://mysftway.blogspot.com/ 熱誠熱心地幫忙大家! 希望與大家切磋技術哦~
    2011年11月10日 上午 10:41
  • 有可能是執行緒太多, 而你的電腦資源不足以支撐執行緒的切換以及記憶體耗用.

    另個可能性是產生死結.

    也許你可以看看MSDN文件的[Managed 執行緒處理], 找找有沒有和你的程式有可能相關的問題.

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年11月10日 上午 10:45
    版主
  • 請問讀檔出錯是怎樣的情況?

    我的Bat檔一樣是產生一個txt檔

    接著我就去讀取這個txt檔,我單步看過有順利讀到資料。

    而且前幾次迴圈都沒問題,問題是在後面不知到第幾次的迴圈突然停了。

     

    2011年11月10日 下午 01:02
  • 關於死結

    想請問如果死結產生,C#會不會有提示呢?

    類似有其他程式正在讀取此資源的提示

    2011年11月10日 下午 01:03
  • 這一段程式碼有沒有放到執行緒中執行?

    bool AllDone = false;               
    while (!AllDone)
    {
           for (int i = 0; i < LocalTotalAnt; i++)
           {                       
                if (testThread[i].IsAlive == true)
               {
                       AllDone = false;
                       break;
                }
                else
                {
                        AllDone = true;
                }
            }                   
     }

     

    2011年11月10日 下午 01:23
  • 那讀檔應該就沒有問題了。

    有加過break point debug觀察嗎?


    http://mysftway.blogspot.com/ 熱誠熱心地幫忙大家! 希望與大家切磋技術哦~
    2011年11月10日 下午 01:31
  • 使用一下Process Monitor,看一下thread跟process在做哪一些事,最後掛在哪裡。

    請參考:

    1. http://technet.microsoft.com/en-us/sysinternals/bb896645
    2. http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/08/18/977.aspx

    或是使用windbg,抓一下hang dump出來看,是哪一些thread在作怪:

    請參考:

    1. http://blogs.msdn.com/b/tess/archive/2006/10/16/net-hang-debugging-walkthrough.aspx
    2. http://blog.miniasp.com/post/2008/05/18/Use-WinDbg-Analysis-and-Solve-Program-Hang-Problem.aspx

    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年11月10日 下午 02:40
  • 主機是x86還是x64?

    記憶體多大?

    2011年11月10日 下午 07:30
  • x64

    記憶體2G

    2011年11月11日 上午 02:18
  • 這一段程式碼有沒有放到執行緒中執行?

    bool AllDone = false;               
    while (!AllDone)
    {
           for (int i = 0; i < LocalTotalAnt; i++)
           {                       
                if (testThread[i].IsAlive == true)
               {
                       AllDone = false;
                       break;
                }
                else
                {
                        AllDone = true;
                }
            }                   
     }

     


    沒有喔 ~ 這段是用來等待所有執行緒的。
    2011年11月11日 上午 02:28
  • 那讀檔應該就沒有問題了。

    有加過break point debug觀察嗎?


    http://mysftway.blogspot.com/ 熱誠熱心地幫忙大家! 希望與大家切磋技術哦~
    恩 每次迭代中應該都沒有問題,我把他改成非執行緒跑都OK。
    2011年11月11日 上午 02:29
  • 你的記憶體不夠用,先把執行緒數量調小一些或改用ThreadPool試試

    2011年11月11日 上午 03:18
  • 若執行同一個 Process ,不需要用批次檔。

    執行緒要新建前,應確認前一個執行緒以完結。

    我是用 WorkThreads(ibt).ThreadState = Threading.ThreadState.Stopped 來判斷。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月11日 下午 02:42
  • 你的記憶體不夠用,先把執行緒數量調小一些或改用ThreadPool試試

    我嘗試用過ThreadPool,一樣的狀況,不過我想我記憶體可能真的不夠用,感謝!
    2011年11月12日 上午 04:19
  • 使用一下Process Monitor,看一下thread跟process在做哪一些事,最後掛在哪裡。

    請參考:

    1. http://technet.microsoft.com/en-us/sysinternals/bb896645
    2. http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/08/18/977.aspx

    或是使用windbg,抓一下hang dump出來看,是哪一些thread在作怪:

    請參考:

    1. http://blogs.msdn.com/b/tess/archive/2006/10/16/net-hang-debugging-walkthrough.aspx
    2. http://blog.miniasp.com/post/2008/05/18/Use-WinDbg-Analysis-and-Solve-Program-Hang-Problem.aspx

    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki

    好實用的東西,我都不知道有這種東西,讓我嘗試看看! 感恩!
    2011年11月12日 上午 04:19
  • 若執行同一個 Process ,不需要用批次檔。

    執行緒要新建前,應確認前一個執行緒以完結。

    我是用 WorkThreads(ibt).ThreadState = Threading.ThreadState.Stopped 來判斷。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    因為我要呼叫三四個執行檔,而且每個執行檔都要要輸入參數,因此要使用批次檔。
    關於Stopped我會嘗試看看 感謝!
    2011年11月12日 上午 04:48
  • 變數名而已...

    Public WorkThreads(ThreadIndex.UBound) As Threading.Thread


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月12日 上午 08:58
  • 變數名而已...

    Public WorkThreads(ThreadIndex.UBound) As Threading.Thread


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    感謝您的幫忙,只是仍然沒有解決我可能還需要再嘗試看看。
    2011年11月13日 上午 07:25