Threadlocal 值 iList 排序

Threadlocal values iList ordering

您好,我有一个创建 2 个线程的示例。我的问题是,当我输出值时,它总是在 999 之前打印 1000。是否可以在 1000 之前打印 999。只想知道它们是如何排序的?

 static void Main(string[] args)
    {
        ThreadLocal<int> field = new ThreadLocal<int>(() => 0, true);



        Thread firstThread = new Thread(new ThreadStart(() =>
        {

            field.Value = 999;
        }));
        Thread secondThread = new Thread(new ThreadStart(() =>
        {

            field.Value = 1000;
        }));


        firstThread.Start();
        secondThread.Start();


        firstThread.Join();
        secondThread.Join();

        IList<int> valueList = field.Values;

        foreach (int arr in valueList)
            Console.WriteLine(arr);


        Console.Read();
    }

通常你不应该编写多线程代码,哪些线程依赖于哪个先完成。

但是您的要求可以通过Semaphore/WaitHandle

来实现
//Creates semaphore with 1 possible owner and the owner slot taken
var sema = new Semaphore(1, 1);

Thread firstThread = new Thread(new ThreadStart(() =>
{
        //Value set and sema is released, if this thread calls release
        //before `secondThread` attempts to acquire then there will be no stalling
        field.Value = 999;
        sema.Release();
}));

Thread secondThread = new Thread(new ThreadStart(() =>
{
        sema.WaitOne();
        field.Value = 1000;
}));

阅读这本书(信号量小书):第 3 章 - 基本同步模式以获取有关基本 signaling/waiting 的更多信息: http://www.greenteapress.com/semaphores/downey08semaphores.pdf