2010-04-17 55 views
0

我想同步創建+5個線程,所以不應該有任何併發​​錯誤。
代碼:BSoD創建線程時

System.Threading.Thread t = new System.Threading.Thread(proc); 
t.Start();//==t.BlueScreen(); 
t.Join(); 

是黑暗的特徵?
我做錯了什麼?

操作系統:Microsoft Windows Vista中(不幸)64
語言:C#3.0 | 4.0
.NET版本:3.5 | 4

編輯:

Personel[] spersonel; 

PROC:

void proc() 
{ 
    spersonel = Personel.GetRows(GetThreadSafeDataConnection()); 
} 

Personel:

internal static Personel[] GetRows(System.Data.SqlClient.SqlConnection Connection) 
     { 
      int i = 0; 
      int c = SomeOtherGODClass.Val_int(SomeGODClass.ExecuteScalar("Select Count(*) from Personel", Connection).ToString()); 
      Personel[] Rs = new Personel[c]; 
      System.Data.SqlClient.SqlDataReader sdr = SomeGODClass.ExecuteReader("Select * from Personel", Connection); 
      while (sdr.Read()) Rs[i++] = new Personel(sdr); 
      sdr.Close(); 
      if (Rs.Length > 1) mergeSort(ref Rs); 
      return Rs; 
     } 
+0

OMG!http://stackoverflow.com/questions/1711037適用於我(但我沒有做任何網絡事情)。 – Behrooz 2010-04-17 17:18:24

回答

3

你粘貼的代碼片段看起來很好,但沒有真正告訴我們很多。粘貼proc的內容會很有幫助,並且可以爲我們提供一個更大範圍的程​​序。

儘可能多地粘貼BSoD的內容,包括爲什麼發生(訪問衝突等)也可能會有所幫助。雖然沒有直接幫助,但它會提供一些線索。

+0

proc用SqlDataReader讀取數據並使用之前打開的SqlConnection。 – Behrooz 2010-04-17 16:28:40

+1

在任何情況下操作系統都不應該拋出BSoD。也就是說,你確定它是跨線程正確同步的嗎?當你只在一個線程下運行代碼時,代碼是否是BSoD? – 2010-04-17 16:32:01

+0

它使用1個線程時沒有BSOD。並且錯誤代碼是0xc0000007 – Behrooz 2010-04-17 16:33:14

1

您的錯誤代碼不是典型的BSOD代碼。這是STATUS_PAGEFILE_QUOTA,「該進程的頁面文件配額已用盡。」

可以在64位版本的Windows上獲得此版本。 64位程序不能耗盡內存,他們擁有16 TB的虛擬內存。他們首先用完了可映射的內存頁面。操作系統設置程序可以佔用多少頁面文件大小的上限。你超過了它。如果它確實是BSOD,那麼它可能用完了內核內存池空間,創建的每個線程都需要內核堆棧的大約24 KB內存。我不得不猜測你的程序創建的方式太多了。請關注Taskmgr.exe,進程選項卡中的線程列。 「性能」選項卡顯示內核內存池發生的情況。