2011-02-11 94 views
0

我有一个小小的困惑。我使用一个名为地位与属性在C#中的静态变量,分别如下使用锁时的注意事项

private static bool status; 

public static bool Status 
{ 
    get { return status; } 
    set { status = value; } 
} 

我现在已经开始2个线程 第一个线程使用属性变量状态为真/假 第二个线程设置值,使用得到值属性为可变状态。

在这种情况下

在这里,我想一样,如果第一个线程试图同时第二个线程试图读取的变量状态

我是否需要使用锁语句中的值更新的变量状态值会发生什么
对于这个变量状态里面的属性来处理线程同步还是不需要的? 任何人都可以通过澄清这个疑问来帮助我吗?

+0

[正在访问C#中的变量是原子操作?](http://stackoverflow.com/questions/9666/is-accessing-a-variable-in-c-an-atomic-operation) – 2011-02-11 10:22:10

+0

我是这个c#.net环境的新手。我看到了这个链接,它看起来非常高。我无法清楚地理解。你能否得出结论并告诉我应该使用锁定语句吗? – Senthil 2011-02-11 10:31:00

回答

0

同步访问里面的该属性不会实现任何目的,因为锁是为了阻止访问共享资源跨越使用该资源的代码块。

需要同步的是访问属性的整个块。一般来说,您需要在呼叫者级同步访问。

void Thread1() { 
    lock(myObj) { 

     if(myObj.Status) 
      Console.WriteLine("Status is true"); 

     // ... 

     // myObj.Status is guaranteed to be still true as long as 
     // all the code that accesses the property lock myObj. 
     if(myObj.Status) 
      Console.WriteLine("Status is still true"); 

    } 
} 

请注意,您不需要锁定具有该属性的对象。只要它在所有相关线程之间共享,您就可以使用另一个对象作为同步机制。

static object mutex = new object(); 

void Thread1() { 
    lock(mutex) { 

     if(myObj.Status) 
      Console.WriteLine("Status is true"); 

     // ... 

     // myObj.Status is guaranteed to be still true as long as 
     // all the code that accesses the property lock myObj. 
     if(myObj.Status) 
      Console.WriteLine("Status is still true"); 

    } 
} 
1

从你的问题我明白线程一产生的状态值和线程两消耗的价值,并做了一些工作的基础上。这里不需要锁,因为从原始类型读取是线程安全的(当你正在读取其他线程不会破坏的数据时)。只有当您有两个或更多想要写入数据的写入器线程时才需要锁定。例如,如果您的线程都要设置状态值,则需要锁定块。