水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
1/1
|
转到
主题:这样的程序有问题吗
楼主
|
grainbuds
|
2021-09-28 13:02:14
|
展开
bool test = false; // 如果是std::atomic<bool> test = false 是否可以
int v;
线程1
while(true)
{
if (!test)
{
v = GetV();
test = true;
}
}
线程2
while(true)
{
if(test)
{
UseV(v);
test = false;
}
}
--
修改:grainbuds FROM 36.113.96.*
FROM 36.113.96.*
6楼
|
grainbuds
|
2021-09-28 14:46:16
|
展开
std::atomic<bool> test = false;
int v;
线程1
while(true)
{
if (!test)
{
v = GetV();
test = true;
}
}
线程2
while(true)
{
if(test)
{
UseV(v);
test = false;
}
}
修改了一下,这样能解决乱序的问题吗。
【 在 foliver 的大作中提到: 】
: 当然有问题。
: 首先test应该声明为voilate。然后由于指令重排和乱序,test的赋值可能会被提前执行。
: 如果你想写无锁代码,先理解一下什么是memory fence,以及在C++11中如何实现。
: ...................
--
FROM 36.113.96.*
9楼
|
grainbuds
|
2021-09-28 14:48:17
|
展开
好的,我了解一下这个算法
【 在 ArchLinux 的大作中提到: 】
: 看着有点像Dekker算法,不同之处是这里只有一个相当于Dekker算法里面turn的共享变量。
:
https://en.wikipedia.org/wiki/Dekker's_algorithm
:
--
FROM 36.113.96.*
12楼
|
grainbuds
|
2021-09-28 14:57:53
|
展开
好的,我查查资料。
【 在 foliver 的大作中提到: 】
: 和原子性关系不大,重点得保证test的赋值一定是最后执行。
: 所以得使用fence。
--
FROM 36.113.96.*
14楼
|
grainbuds
|
2021-09-28 15:05:56
|
展开
如何加锁,特别是实时性要求比较高。
【 在 ble 的大作中提到: 】
: 用锁很便宜的,甚至有的时候比原子操作都快,为啥不用呢。
:
--
FROM 36.113.96.*
18楼
|
grainbuds
|
2021-09-29 11:03:11
|
展开
查了一下资料,是否至少在x86/64下没问题,因为具有strong memory model
【 在 foliver 的大作中提到: 】
: 和原子性关系不大,重点得保证test的赋值一定是最后执行。
: 所以得使用fence。
--
FROM 117.136.119.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版
水木安卓官方客户端