是否有表格来总结内存顺序的差异? 比如使用每个内存顺序的情况
此外,内存顺序与(data_cond和future)之间有什么区别?
is it
1. memory order is for waiting
2. data_cond is for waiting
3. future is for doing other thing while waiting
答案 0 :(得分:2)
内存命令用于指定原子操作中的内存排序。最简单的内存顺序是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;
}
}
最后,未来允许线程可以将值返回到进行调用的代码部分。
int main() {
std::future<int> r = std::async(do_something, 1, 10);
do_something_else();
std::cout << “Result= “ << r.get() << std::endl;
return 0;
}