c# - 使用联锁用法

标签 c# multithreading

我正在尝试编写一个多线程程序,其中每个线程都会使用一个计数器,然后递增它。

例如:

lock(this)
{
   counter++;
   Console.WriteLine(counter); 
}

我知道对于增量我可以使用:

System.Threading.Interlocked.Increment(counter);

但是对于递增和对计数器做某事的锁定呢?

谢谢!

最佳答案

这样做是可以的:

线程 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);
}

但是这样做不行 OK:

线程 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;
}

(顺便说一句,don't use lock on this .)

关于c# - 使用联锁用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9517951/

相关文章:

java - 多线程环境下的 HashMap 和哈希表

C 指针在执行期间奇怪地自增量为未知值

c# - 关键终结器中的线程亲和性

c# - 在图片中结合MVVM和MVC

c# - vshost.exe 文件的用途是什么?

c# - 读取上传的 Excel 文件

c# - 如何从 ASP.NET Core 中的 .json 文件读取 AppSettings 值

C 程序在 GDB 中运行但不正常

c++ - 如何在 ubuntu 12.04 中为 openCV 项目设置 openMP 多线程?

c# - 身份服务器 : Add claims to access token in hybrid flow in MVC client