在Threading程序中使用锁定机制相当于同步执行代码而不是异步执行代码吗?

时间:2015-05-02 09:27:41

标签: c# locking

下面的示例代码使用了锁定的概念。但这阻止了它进行并行执行。问题的标题是否正确: 在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();  
    }
}

2 个答案:

答案 0 :(得分:2)

  

在Threading程序中使用锁定机制等同于同步执行代码而不是异步执行代码吗?

特别是在您的示例中,您使用锁包装整个方法调用,因此您将遇到同步行为,并且在这种情况下线程将是无用的并且提供比增益更多的开销。

很多时候,您在访问共享状态时需要锁定的特定位置,这通常是并行度限制所在的位置。但是如果你有大量的CPU工作可以并行执行,你仍然可以获得计算上的好处。

作为旁注,异步和平行主义之间存在差异。我建议您阅读this article了解更多关于两者含义的内容。

答案 1 :(得分:0)

  

在Threading程序中使用锁定机制等同于同步执行代码而不是异步执行代码吗?

它将同步程序缺乏并发性与多线程的开销结合起来,将两种方法的较差部分结合起来。

这只是为了证明锁定力同步访问特定的代码位。在真正的多线程使用中,人们可以在尽可能短的时间内保持锁定,因此不同的线程可以同时工作,并且在绝对必要时只能相互阻塞。