我正在尝试编写一个多线程程序,其中每个线程将使用一个计数器,然后递增它。
例如:
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
复制相似问题