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
您好,我有一个创建 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