在 Threading 程序中使用锁定机制是否等同于同步而不是异步执行代码?
Is using locking mechanism in Threading program equivalent to executing the code synchronously rather then asynchronously?
下面的示例代码使用了锁定的概念。但这会阻止它进行并行执行。那么问题的标题是否正确:
在 Threading 程序中使用锁定机制是否等同于同步而不是异步执行代码?
同样的情况是否适用于 Threading.Monitor 并使用 [同步] 属性声明 class??
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();
}
}
Is using locking mechanism in Threading program equivalent to executing the code synchronously rather then asynchronously?
特别是在您的示例中,您用锁包装了整个方法调用,因此您将体验到同步行为,在这种情况下线程将毫无用处,并且提供的开销大于收益。
很多时候,在访问共享状态时,您有一个特定的地方需要锁定,而这通常是并行度的限制所在。但是,如果您有大量可以并行执行的 CPU 工作,您仍然可以获得计算优势。
附带说明一下,异步和并行是有区别的。我建议您阅读 this article 以详细了解两者的含义。
Is using locking mechanism in Threading program equivalent to executing the code synchronously rather then asynchronously?
它结合了同步程序缺乏并发性和多线程的开销,以结合这两种方法的较差部分。
这只是为了证明锁定会强制同步访问特定的代码位。在真正的多线程使用中,一个人持有锁的时间尽可能短,因此不同的线程可以同时工作,只有在绝对必要时才会相互阻塞。
下面的示例代码使用了锁定的概念。但这会阻止它进行并行执行。那么问题的标题是否正确: 在 Threading 程序中使用锁定机制是否等同于同步而不是异步执行代码?
同样的情况是否适用于 Threading.Monitor 并使用 [同步] 属性声明 class??
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();
}
}
Is using locking mechanism in Threading program equivalent to executing the code synchronously rather then asynchronously?
特别是在您的示例中,您用锁包装了整个方法调用,因此您将体验到同步行为,在这种情况下线程将毫无用处,并且提供的开销大于收益。
很多时候,在访问共享状态时,您有一个特定的地方需要锁定,而这通常是并行度的限制所在。但是,如果您有大量可以并行执行的 CPU 工作,您仍然可以获得计算优势。
附带说明一下,异步和并行是有区别的。我建议您阅读 this article 以详细了解两者的含义。
Is using locking mechanism in Threading program equivalent to executing the code synchronously rather then asynchronously?
它结合了同步程序缺乏并发性和多线程的开销,以结合这两种方法的较差部分。
这只是为了证明锁定会强制同步访问特定的代码位。在真正的多线程使用中,一个人持有锁的时间尽可能短,因此不同的线程可以同时工作,只有在绝对必要时才会相互阻塞。