【问题标题】:BSoD when creating threads创建线程时出现蓝屏
【发布时间】:2010-04-17 16:22:42
【问题描述】:

我正在尝试同步创建 +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;

过程:

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

【问题讨论】:

标签: .net multithreading bsod


【解决方案1】:

您粘贴的代码 sn-p 看起来不错,但并不能告诉我们太多信息。粘贴 proc 的内容会很有帮助,并为我们提供更大范围的程​​序正在执行的操作。

尽可能多地粘贴 BSoD 的内容也可能会有所帮助,包括它发生的原因(访问冲突等)。虽然没有直接帮助,但它会提供一些线索。

【讨论】:

  • proc 使用 SqlDataReader 读取数据并使用之前打开的 SqlConnection。
  • 在任何情况下操作系统都不应抛出 BSoD。也就是说,您确定它在线程之间正确同步吗?当你只在单线程下运行代码时会出现蓝屏吗?
  • 使用 1 个线程时不会出现问题。错误代码为0xc0000007
【解决方案2】:

您的错误代码不是典型的 BSOD 代码。为 STATUS_PAGEFILE_QUOTA, "进程的页面文件配额已用完。"

在 64 位版本的 Windows 上获得此功能是可能的。 64 位程序不会耗尽内存,它们有 16 TB 的虚拟内存。它们首先用完可映射的内存页。操作系统设置了程序可以占用多少分页文件大小的上限。你超过了。如果它真的是 BSOD,那么它可能耗尽了内核内存池空间,您创建的每个线程需要大约 24 KB 的内存用于内核堆栈。

我不得不猜测您的程序正在创建太多线程。请密切注意 Taskmgr.exe 的“进程”选项卡中的“线程”列。性能选项卡显示内核内存池发生的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多