linux共享内存 安全,Linux上C++中线程/共享内存之间的线程安全数据交换

我对此感到困惑:在生产中,我们有两个进程通过共享内存进行通信,数据交换的一部分是漫长的,而且是一个bool.对此数据的访问不同步.它已经很好地工作了很长时间,现在仍然如此.我知道修改一个值不是原子的,但考虑到这些值被修改/访问了数百万次,这不得不失败?

这是一段代码示例,它在两个线程之间交换一个数字:

#include

#include

typedef unsigned long long uint64;

const uint64 ITERATIONS = 500LL * 1000LL * 1000LL;

//volatile uint64 s1 = 0;

//volatile uint64 s2 = 0;

uint64 s1 = 0;

uint64 s2 = 0;

void* run(void*)

{

register uint64 value = s2;

while (true)

{

while (value == s1)

{

_mm_pause();// busy spin

}

//value = __sync_add_and_fetch(&s2, 1);

value = ++s2;

}

}

int main (int argc, char *argv[])

{

pthread_t threads[1];

pthread_create(&threads[0], NULL, run, NULL);

register uint64 value = s1;

while (s1 < ITERATIONS)

{

while (s2 != value)

{

_mm_pause();// busy spin

}

//value = __sync_add_and_fetch(&s1, 1);

value = ++s1;

}

}

正如你所看到的,我已经评论了几件事情:

// volatile uint64 s1 = 0;

// value = __sync_add_and_fetch(&s1,1);

__sync_add_and_fetch以原子方式递增变量.

我知道这不是很科学,但运行几次没有同步功能它完全没问题.此外,如果我测量两个版本的同步和没有同步,它们以相同的速度运行,为什么__sync_add_and_fetch没有添加任何开销?

我的猜测是编译器保证了这些操作的原子性,因此我没有看到生产中的问题.但仍无法解释为什么__sync_add_and_fetch不会增加任何开销(甚至在调试中运行).

关于矿山环境的更多细节:ubuntu 10.04,gcc4.4.3 intel i5 multicore cpu.

生产环境类似于它在更强大的CPU和Centos OS上运行.

谢谢你的帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值