C#同步错误-CreateThread失败?

C#同步错误-CreateThread失败?,c#,multithreading,synchronization,C#,Multithreading,Synchronization,最近,我收到一封电子邮件,要求我就一些问题提供帮助。(它没有任何代码,但只有一个堆栈跟踪…),但经过一些思考和搜索,我可以认为这是因为同步问题。他可能会queue.Enqueue()没有锁定,所以我写了“你应该做锁定!”作为回应 然后,我觉得给他举个小例子很好 using System; using System.Collections.Generic; using System.Threading; static class Program { private static Queu

最近,我收到一封电子邮件,要求我就一些问题提供帮助。(它没有任何代码,但只有一个堆栈跟踪…),但经过一些思考和搜索,我可以认为这是因为同步问题。他可能会
queue.Enqueue()没有锁定,所以我写了“你应该做
锁定
!”作为回应

然后,我觉得给他举个小例子很好

using System;
using System.Collections.Generic;
using System.Threading;

static class Program
{
    private static Queue<int> q = new Queue<int>();

    static void Main(string[] args)
    {
        Thread[] thrds = new Thread[100];
        for (int i = 0; i < 100; i++)
        {
            //thrds[i] = new Thread(do_safe);
            thrds[i] = new Thread(do_unsafe); // <--
            thrds[i].Start(i);
        }

        for (int i = 0; i < 100; i++)
        {
            thrds[i].Join();
        }

        foreach (int i in q)
        {
            Console.WriteLine(i);
        }
    }
    private static void do_safe(object k)
    {
        int val = (int)k;
        for (int i = 0; i < 100; i++) // do something
        {
            val += i;
            Thread.Sleep(0);
        }

        lock (q)
            q.Enqueue(val); // with locking
    }
    private static void do_unsafe(object k)
    {
        int val = (int)k;
        for (int i = 0; i < 100; i++) // do something
        {
            val += i;
            Thread.Sleep(1);
        }

        q.Enqueue(val); // without locking
    }
}
由于同步问题发生在
q.Enqueue
中,因此我预计会在其中引发一些异常。(实际上,邮件是这样写的。)


但崩溃消息说线程创建失败。我知道线程同步问题会导致任何问题,(这种情况可能是一种很好的做法>气味此错误每次都会产生?@dotnetstep是的。请自己尝试-Go和fork。我猜这在Mono中会发生,因为邮件中说Microsoft CLR中的
Enqueue
中引发了一些异常。这可能是对ideone的限制吗?如果在本地运行示例,则不会发生CreateThread错误。同样的情况ideone中的do_安全方法也会发生CreateThread错误。请注意,将Thread.Sleep(0)更改为Thread.Sleep(1),就像在do_中一样。我在Fedora 17上遇到了这个问题。奇怪的是,重新启动服务有时会解决这个问题。
ves_icall_System_Threading_Thread_Thread_internal: CreateThread error 0x0
Unhandled Exception: System.SystemException: Thread creation failed.
  at System.Threading.Thread.Start () [0x00000] in <filename unknown>:0 
  at System.Threading.Thread.Start (System.Object parameter) [0x00000] in <filename unknown>:0 
  at Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.SystemException: Thread creation failed.
  at System.Threading.Thread.Start () [0x00000] in <filename unknown>:0 
  at System.Threading.Thread.Start (System.Object parameter) [0x00000] in <filename unknown>:0 
  at Program.Main (System.String[] args) [0x00000] in <filename unknown>:0