我有一个小小的困惑。我在c#中使用一个名为status with property的静态变量,如下所示
private static bool status;
public static bool Status
{
get { return status; }
set { status = value; }
}
现在我已分别启动2个线程 第一个线程使用变量status的属性将值设置为true / false 第二个线程使用属性获取变量状态的值。
在这种情况下,我想会发生什么事情 如果第一个线程尝试更新变量状态的值,而第二个线程尝试读取变量状态的值
我是否需要在属性内部对此变量状态使用lock语句来处理线程同步或不需要? 有人可以通过澄清这个疑问帮助我吗?
答案 0 :(得分:1)
从你的问题我理解,线程1产生状态值,线程2消耗该值,并根据它做一些工作。这里没有锁需要,因为从原始类型读取是线程安全的(当你正在读取数据时,其他线程不会破坏它)。只有当您有两个或更多想要写入数据的写入程序线程时才需要锁定。例如,如果您的线程都要设置Status值,则需要锁定块。
答案 1 :(得分: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");
}
}