下面的示例代码使用了锁定的概念。但这阻止了它进行并行执行。问题的标题是否正确: 在Threading程序中使用锁定机制等同于同步执行代码而不是异步执行代码吗?
同样的情况适用于Threading.Monitor并使用[Synchronization] Attribute声明类吗?
static void Main(string[] args)
{
Console.WriteLine("*****Synchronizing Threads *****\n");
Printer p = new Printer();
// Make 10 threads that are all pointing to the same
// method on the same object.
Thread[] threads = new Thread[10];
for (int i = 0; i < 10; i++)
{
threads[i] = new Thread(new ThreadStart(p.PrintNumbers));
threads[i].Name = string.Format("Worker thread #{0}", i);
}
// Now start each one.
foreach (Thread t in threads)
t.Start();
Console.ReadLine();
}
public void PrintNumbers()
{
// Use the private object lock token.
lock (threadLock)
{
// Display Thread info.
Console.WriteLine("-> {0} is executing PrintNumbers()",Thread.CurrentThread.Name);
// Print out numbers.
Console.Write("Your numbers: ");
for (int i = 0; i < 10; i++)
{
Random r = new Random();
Thread.Sleep(1000 * r.Next(5));
Console.Write("{0}, ", i);
}
Console.WriteLine();
}
}
答案 0 :(得分:2)
在Threading程序中使用锁定机制等同于同步执行代码而不是异步执行代码吗?
特别是在您的示例中,您使用锁包装整个方法调用,因此您将遇到同步行为,并且在这种情况下线程将是无用的并且提供比增益更多的开销。
很多时候,您在访问共享状态时需要锁定的特定位置,这通常是并行度限制所在的位置。但是如果你有大量的CPU工作可以并行执行,你仍然可以获得计算上的好处。
作为旁注,异步和平行主义之间存在差异。我建议您阅读this article了解更多关于两者含义的内容。
答案 1 :(得分:0)
在Threading程序中使用锁定机制等同于同步执行代码而不是异步执行代码吗?
它将同步程序缺乏并发性与多线程的开销结合起来,将两种方法的较差部分结合起来。
这只是为了证明锁定力同步访问特定的代码位。在真正的多线程使用中,人们可以在尽可能短的时间内保持锁定,因此不同的线程可以同时工作,并且在绝对必要时只能相互阻塞。