首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用互锁使用

使用互锁使用
EN

Stack Overflow用户
提问于 2012-03-01 22:28:22
回答 5查看 18.5K关注 0票数 6

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

例如:

代码语言:javascript
运行
复制
lock(this)
{
   counter++;
   Console.WriteLine(counter); 
}

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

代码语言:javascript
运行
复制
System.Threading.Interlocked.Increment(counter);

但是,对于递增和对计数器执行某些操作的锁定又如何呢?

谢谢!

EN

回答 5

Stack Overflow用户

发布于 2012-03-01 22:46:20

这样做是可以的:

线程A:

代码语言:javascript
运行
复制
var incremented_counter = Interlocked.Increment(ref counter);
Console.WriteLine(incremented_counter);

线程B:

代码语言:javascript
运行
复制
Interlocked.Increment(ref counter);

这样做是可以的:

线程A:

代码语言:javascript
运行
复制
lock (the_lock) {
   ++counter;
   Console.WriteLine(counter); 
}

线程B:

代码语言:javascript
运行
复制
lock (the_lock) {
   ++counter;
}

这样做是可以的,但却是多余的

线程A:

代码语言:javascript
运行
复制
lock (the_lock) {
    var incremented_counter = Interlocked.Increment(ref counter);
    Console.WriteLine(incremented_counter);
}

线程B:

代码语言:javascript
运行
复制
lock (the_lock) {
    Interlocked.Increment(ref counter);
}

但是这样做是不好的:

线程A:

代码语言:javascript
运行
复制
Interlocked.Increment(ref counter);
Console.WriteLine(counter);

线程B:

代码语言:javascript
运行
复制
Interlocked.Increment(ref counter);

它也不是这样做的:

线程A:

代码语言:javascript
运行
复制
lock (the_lock) {
   ++counter;
   Console.WriteLine(counter); 
}

线程B:

代码语言:javascript
运行
复制
Interlocked.Increment(ref counter);

它也不是这样做的:

线程A:

代码语言:javascript
运行
复制
var incremented_counter = Interlocked.Increment(ref counter);
Console.WriteLine(incremented_counter);

线程B:

代码语言:javascript
运行
复制
lock (the_lock) {
   ++counter;
}

(顺便说一句, 。)

票数 27
EN

Stack Overflow用户

发布于 2012-03-01 22:32:17

所有的互锁函数都会在修改后返回一个值的副本,在线程中使用该值。

代码语言:javascript
运行
复制
var localCounter = System.Threading.Interlock.Increment(counter);
票数 4
EN

Stack Overflow用户

发布于 2012-03-01 22:32:10

您将需要使用锁来保护读取和写入。在这种情况下,lock语句工作得最好,并且最容易遵循:

代码语言:javascript
运行
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9517951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档