memory_order_seq_cst与其他内存顺序有什么不同?
what are the difference in memory_order_seq_cst with other memory order?
是否有一个表来总结内存顺序的差异?例如在什么情况下使用每个内存顺序
此外,内存顺序和(data_cond and future)之间有什么区别?is it
1. memory order is for waiting
2. data_cond is for waiting
3. future is for doing other thing while waiting
内存顺序用于指定原子操作中的内存顺序。最简单的内存顺序是memory_order_seq_cst
,它提供了顺序一致性。其他内存模型给出宽松的内存顺序。
如果您想获得获取-释放顺序,您应该组合:memory_order_consume
, memory_order_acquire
, memory_order_release
和memory_order_acq_rel
.
如果你想获得一个宽松的排序,你应该使用memory_order_relaxed
。
class spinlock_mutex {
private:
std::atomic_flag f;
public:
spinlock_mutex() : f(ATOMIC_FLAG_INIT) {}
void lock() {
while (f.test_and_set(std::memory_order_acquire)) {}
}
void unlock() {
flag.clear(std::memory_order_release());
}
};
c++ 11中有data_cond类型。我想你可能指的是std::condition_variable
,这是一个与互斥锁相关联的条件变量。
std::mutex m;
std::queue<request> q;
std::condition_variable cv;
void producer() {
while (more_data()) {
request r = generate_request();
std::lock_guard<std::mutex> l(m);
q.push(r);
cv.notify_one();
}
}
void consumer() {
for (;;) {
std::unique_lock<std::mutex> l(m);
cv.wait(l, []{ return !q.empty();});
request r = q.front();
l.unlock();
process_request(r);
if (is_last(r)) break;
}
}
最后,future允许线程向调用的代码段返回一个值。
int main() {
std::future<int> r = std::async(do_something, 1, 10);
do_something_else();
std::cout << “Result= “ << r.get() << std::endl;
return 0;
}
相关文章:
- 计算 I+V[i++] 的顺序是什么?
- C++:使用方法调用析构函数的顺序是什么?
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 函数模板实例化、替换和重载解析的顺序是什么?
- 变量按什么顺序相乘
- libavdevice 和 x11 的静态链接库应该以什么顺序链接?
- 顺序一致性和获取/发布语义有什么区别?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 在 OpenGL 中计算矩阵时,转换的正确顺序是什么?
- 堆排序,我无法弄清楚我的代码出了什么问题,输出顺序不正确
- 在 C++ 中,以相反顺序排序的最快方法是什么?
- 操纵器,C 我应该使用什么顺序
- 这种情况以什么顺序发生
- 在 c++ 中应按什么顺序释放内存?
- 具有类层次结构时按什么顺序调用方法
- 我应该按什么顺序发送callback()并通知服务员?
- 如果在一行中声明两个对象,则按什么顺序构造它们
- 交叉引用、前向声明等:按什么顺序
- 我以什么顺序包含头文件?