我正在尝试编写一个多线程程序,其中每个线程将使用一个计数器,然后递增它。
例如:
lock(this)
{
counter++;
Console.WriteLine(counter);
}
我知道对于增量,我可以使用:
System.Threading.Interlocked.Increment(counter);
但是,对于递增和对计数器执行某些操作的锁定又如何呢?
谢谢!
发布于 2012-03-01 22:46:20
这样做是可以的:
线程A:
var incremented_counter = Interlocked.Increment(ref counter);
Console.WriteLine(incremented_counter);
线程B:
Interlocked.Increment(ref counter);
这样做是可以的:
线程A:
lock (the_lock) {
++counter;
Console.WriteLine(counter);
}
线程B:
lock (the_lock) {
++counter;
}
这样做是可以的,但却是多余的
线程A:
lock (the_lock) {
var incremented_counter = Interlocked.Increment(ref counter);
Console.WriteLine(incremented_counter);
}
线程B:
lock (the_lock) {
Interlocked.Increment(ref counter);
}
但是这样做是不好的:
线程A:
Interlocked.Increment(ref counter);
Console.WriteLine(counter);
线程B:
Interlocked.Increment(ref counter);
它也不是这样做的:
线程A:
lock (the_lock) {
++counter;
Console.WriteLine(counter);
}
线程B:
Interlocked.Increment(ref counter);
它也不是这样做的:
线程A:
var incremented_counter = Interlocked.Increment(ref counter);
Console.WriteLine(incremented_counter);
线程B:
lock (the_lock) {
++counter;
}
发布于 2012-03-01 22:32:17
所有的互锁函数都会在修改后返回一个值的副本,在线程中使用该值。
var localCounter = System.Threading.Interlock.Increment(counter);
发布于 2012-03-01 22:32:10
您将需要使用锁来保护读取和写入。在这种情况下,lock
语句工作得最好,并且最容易遵循:
private int counter;
private readonly object locker = new object();
public void IncrementCounter()
{
lock (this.locker)
{
this.counter++;
Console.WriteLine(counter);
}
}
public int GetCounter()
{
lock (this.locker)
{
return this.counter;
}
}
https://stackoverflow.com/questions/9517951
复制相似问题