【发布时间】:2016-12-10 20:42:36
【问题描述】:
我需要为每个线程保持我的变量“计数器”私有。
我尝试使用:
object locker = new object();
private object locker = new object();
private static readonly object locker = new object();
但它们都不起作用。
我还有其他方法可以解决这个问题吗?
这是我的代码。
public partial class Form1 : Form
{
int counter = 0;
private static readonly object locker = new object();
public Form1()
{
InitializeComponent();
Task t1 = new Task(() =>
{
func();
});
Task t2 = new Task(() =>
{
func();
});
// two threads
t1.Start();
t2.Start();
}
void func()
{
lock (locker)
{
counter++;
Console.Write(counter + " "); // prints "1 2"
// it should print "1 1"
}
}
}
【问题讨论】:
-
有什么理由不能将
counter移动到func内部? -
线程锁定变量不是问题。这正是预期的输出 - 您刚刚使
counter变量线程安全。它一次只能增加一个线程,这就是它给出1 2的原因。如果你删除你的保护措施(即lock(..)),输出将变得不可预测并且可能输出1 1,因为现在两个线程可能同时读取和写入同一个变量。counter是相对于类的全局变量,而不是线程局部变量。 -
@MaximilianGerhardt 我认为您的意思是类级别的变量。 C# 没有全局变量。
-
不清楚你想实现什么。事实上
lock不会使变量private因为这两个概念之间没有关系...
标签: c# multithreading parallel-processing locking