BSoD при создании потоков - PullRequest
0 голосов
/ 17 апреля 2010

Я пытаюсь создать +5 потоков синхронно, поэтому не должно быть ошибок параллелизма.
Код:

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

Является ли темнота особенностью?
Я что-то не так делаю?

ОС: Microsoft Windows Vista (к сожалению) x64
Язык: C # 3.0 | 4.0
.Net версия: 3.5 | 4

редактировать:

Personel[] spersonel;

proc:

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

Кадровая:

   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;
        }

Ответы [ 2 ]

3 голосов
/ 17 апреля 2010

Вставленный вами фрагмент кода выглядит хорошо, но на самом деле он нам мало что говорит. Было бы полезно вставить содержимое proc и предоставить нам более широкий обзор того, что делает ваша программа.

Также может быть полезно вставить как можно больше содержимого BSoD, включая причины его возникновения (нарушение доступа и т. Д.). Хотя это и не помогло бы напрямую, оно дало бы некоторые подсказки.

1 голос
/ 17 апреля 2010

Ваш код ошибки не является типичным кодом BSOD. Это STATUS_PAGEFILE_QUOTA, «Квота на файл подкачки для процесса исчерпана».

Возможно получить это на 64-битной версии Windows. 64-разрядным программам не хватает памяти, у них 16 терабайт виртуальной памяти. Сначала у них заканчиваются отображаемые страницы памяти. Операционная система устанавливает верхний предел размера файла подкачки, который может запрограммировать программа. Вы превысили это. Если это действительно BSOD, то, вероятно, ему не хватило места в пуле памяти ядра, для каждого создаваемого вами потока требуется около 24 КБ памяти для стека ядра.

Я должен догадаться, что ваша программа создает слишком много потоков. Следите за столбцом Темы в Taskmgr.exe, вкладка Процессы. Вкладка «Производительность» показывает, что происходит с пулом памяти ядра.

...