您好朋友对线程应用程序有疑问。
class sample
{
static volatile bool _shutdownThreads;
static readonly object _lockerObject = new object();
main()
{
create thread for samplemethod()
lock(_lockerObject)
{
_shutdownThreads = true;
}
}
samplemethod()
{
while(true)
{
lock(_lockerObject)
{
if(_shutdownThreads) break;
}
}
}
}
(1)好吧我猜你可能已经理解我想要完成的事情。我需要有一个安全的方法来使用_shutdownThreads变量。这是正确的做法吗?
(2)如果我锁定一个代码块,那么块内的所有变量也会被锁定?我的意思是甚至其他线程(例如main)也无法访问变量。我是对的吗?
答案 0 :(得分:0)
是的,你是对的。 lock
的目的是让一个线程访问代码块,而其他线程将等待。但是在您的特定情况下:锁定布尔赋值没有意义。 This will be atomic anyway。
答案 1 :(得分:0)
“我需要一种安全的方法来使用_shutdownThreads变量。是的 这是正确的做法吗?“
是的,不。它是安全的,但是你有一个繁忙的循环,它会毫无理由地使用大量的CPU。等待事件有更好的选择,但是你可以通过让线程在每次检查之间休息一段时间来减少恐惧:
while(true) {
lock(_lockerObject) {
if(_shutdownThreads) break;
}
Thread.Sleep(100);
}
“如果我锁定一个代码块,那么块内的所有变量都会得到 锁定了吗?“
不,一点也不。锁不会阻止任何其他线程访问任何数据。锁的唯一作用是阻止任何其他线程进入使用相同标识符引用的代码块(在您的情况下为_lockerObject
)。
为了保护数据,您必须使用相同的标识符引用来访问访问数据的每个代码块周围的锁。