首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用无锁代码同步来自不同线程的添加?

如何使用无锁代码同步来自不同线程的添加?
EN

Stack Overflow用户
提问于 2012-07-05 13:43:53
回答 2查看 167关注 0票数 0

我编写了NasdaqIndex计算的简单示例。为了简单起见,我宣布它为int,这只是10股票价格的总和。

代码语言:javascript
复制
class NasdaqIndex {

private int[] stockValue = new int[10]; // for simplicity let's assume they are already initialized

// just sum from 1 to 10 of stockValue
private int nasdaqIndexValue; // for simplicity let's assume that already initialized

public void StockValueUpdated(int stockValueIndex, int newValue) {
    int diff = newValue - stockValue[stockValueIndex];
    stockValue[stockValueIndex] = newValue;
    nasdaqIndexValue += diff;               // THIS NEED TO BE SYNCHRONIZED!
}

}

但是在现实生活中,StockValueUpdated可能(而且将)被不同的线程调用为不同的stockValueIndex (对于相同的stockValueIndex,它不会被称为并行)。

所以我只需要同步一行代码nasdaqIndexValue += diff;

例如,如果一个线程执行nasdaqIndexValue += 10;,另一个线程执行nasdaqIndexValue += 3;,我需要确保添加的正是13。在这种情况下,我需要同步吗?如果是这样的话,如何使用lock-free代码来实现呢?

UPD oooops我刚刚意识到,每次使用双打时,我都会向nasdaqIndex引入小的“增量”。因此,我要么使用十进制,要么我必须“完全重新计算”nasdaqIndex有时,否则它将不等于股票之和一段时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-05 13:53:10

使用Interlocked类型将该操作作为原子操作:

代码语言:javascript
复制
Interlocked.Add(ref nasdaqIndexValue, diff);
票数 1
EN

Stack Overflow用户

发布于 2012-07-05 13:56:36

使用volatile关键字。

易失性修饰符通常用于由多个线程访问的字段,而不使用lock语句序列化访问。

代码语言:javascript
复制
private volatile int nasdaqIndexValue; // for simplicity let's assume that already initialized
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11345634

复制
相关文章

相似问题

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