2011-09-08 117 views
3

数据必须在线程之间共享。哪个是最好的同步方法?线程同步

锁是更好的方法还是Mutex?

namespace ConsoleApplication8 
{ 
    class Data 
    { 
     public int X 
     { 
      set; 
      get; 
     } 

     public int Y 
     { 
      get; 
      set; 
     } 

     public int result; 
    } 

    class Program 
    { 
     static int a; 
     private static object aLock = new object(); 

     static void Main(string[] args) 
     { 
      ParameterizedThreadStart aStart = new ParameterizedThreadStart(Addition); 
      Thread aThread = new Thread(aStart); 
      Data aData = new Data(); 
      aData.X = 10; 
      aData.Y = 20; 

      Thread aThread2 = new Thread(aStart); 
      aThread2.Start(); 


      aThread.Start(aData); 
      aThread.Join(); 
      aThread2.Join(); 
      Console.WriteLine("End of the program"); 
     } 

     static void Addition(object data) 
     { 
      var a = data as Data; 
      var b = a.X + a.Y; 
      a.result = b; 

      Console.WriteLine(a.result); 
      Thread.Sleep(1000); 
      Console.WriteLine("End of thread"); 
      updateValue(); 
     } 

     static void updateValue() 
     { 
      lock (aLock) 
      { 
       a++; 
      } 
     } 
    } 
} 
+4

定义“更好”的标准。苹果比橙色好吗? – zerkms

+1

或者你只是想知道锁和互斥锁的区别吗? – erikH

+0

看看相同的这些帖子: http://stackoverflow.com/questions/1164038/monitor-vs-mutex-in-c http://stackoverflow.com/questions/1763251/lock-monitor-mutex – Rev

回答

5

你有两个地方你正在“同步”线程。

您正在使用Thread.Join在继续主线程之前等待您的线程完成。没关系。

您也正在使用一个锁来确保一次只有一个线程递增计数器变量a。这也很好,但可以改进。在System.Threading中有一个名为Interlocked的类,它可以以线程安全的方式为您执行增量。

Interlocked.Increment(ref a); 

您的代码不会使用变量a在两个地方 - 内Addition你有一个局部变量a是阴影的静态变量外a。我认为这只是一个巧合。

另一个问题是您的Addition方法将object作为参数。我明白为什么它不会以Data作为参数,因为ParameterizedThreadStart需要一个对象。有一个更好的解决方法。

试试这个代码,而不是:

private static int __counter = 0; 

public class Data 
{ 
    public int X { set; get; } 
    public int Y { set; get; } 
    public int Result { set; get; } 
} 

private void Addition(Data data) 
{ 
    data.Result = data.X + data.Y; 
    Interlocked.Increment(ref __counter); 

    Thread.Sleep(1000); 

    Console.WriteLine(data.Result); 
    Console.WriteLine("End of thread"); 
} 

现在Main可以写为:

void Main() 
{ 
    ParameterizedThreadStart pts = o => Addition(o as Data); 

    var t1 = new Thread(pts); 
    var t2 = new Thread(pts); 

    t1.Start(new Data { X = 10, Y = 20 }); 
    t2.Start(new Data { X = 13, Y = 42 }); 

    t1.Join(); 
    t2.Join(); 

    Console.WriteLine(__counter); 
    Console.WriteLine("End of the program"); 
} 

这应该是一个小整洁。

我没有看到你在代码中分享的数据。也许你可以详细说明一下?