C++ c++;标准::原子<;bool>;::fetch\u是否已实现?
以下代码摘录如下:C++ c++;标准::原子<;bool>;::fetch\u是否已实现?,c++,embedded,atomicity,C++,Embedded,Atomicity,以下代码摘录如下: class myclass { volatile std::atomic<bool> flag; public: myclass(): flag(false) {} bool get_flag() { return flag; } bool try_set() { return !flag.fetch_or(flag, true); } void reset() { flag
class myclass {
volatile std::atomic<bool> flag;
public:
myclass(): flag(false) {}
bool get_flag() { return flag; }
bool try_set() {
return !flag.fetch_or(flag, true);
}
void reset() {
flag = false;
}
};
参考文献说,“完全专业化原子化”被视为“非专业化”,我认为这是问题的根源。所以我怀疑:
“完全专业化”如何“被视为非专业化”李>
在调用flag.fetch_或()
时,使用作为标志模板参数int
而不是bool
是否会遇到任何棘手的陷阱
我正在使用gcc 5.1.0,并使用-std=c++14
进行编译 对于bool
,不需要该方法
29.5“原子类型”
模板结构原子{
[...]
}
模板结构原子{
[...]
整数取数或(整数,内存顺序=内存顺序)无例外;
[...]
}
29.5/1:
原子的专门化操作的语义在29.6中定义
29.6.3/2“原子类型的算术运算”:
在这些函数和函数模板专门化的声明中,名称integral指的是一种整数类型,而名称atomic integral指的是表145或表146中的integral的原子类或命名基类
表145不包含bool
因此,只有struct
的integral(不带bool
)专门化将具有该方法
这有点令人困惑,因为在标准的其余部分中,“整数类型”包括bool,3.9.1/7“基本类型”:
类型bool、char、char16\u t、char32\u t、wchar\u t以及有符号和无符号整数类型统称为整数类型。整数类型的同义词是整数类型
你调查过这件事了吗?它仅为整型数据类型定义。请使用比较交换\u strong
。我不明白:原子::fetch\u或()
不能将bool
作为第二个参数,只能使用可选的内存顺序。try\u set
应该做什么?难道不应该用一个论点来比较,而不是和它自己比较吗?
error: ‘volatile struct std::atomic<bool>’ has no member named ‘fetch_or’
return !flag.fetch_or(flag, true);
class myclass {
volatile std::atomic<int> flag;
public:
myclass(): flag(0) {}
bool get_flag() { return flag; }
bool try_set() {
return !flag.fetch_or(flag, true);
}
void reset() {
flag = 0;
}
};
template <class T> struct atomic {
[...]
}
template <> struct atomic<integral> {
[...]
integral fetch_or(integral , memory_order = memory_order_seq_cst) noexcept;
[...]
}