內存命令用於指定原子操作中的內存排序。最簡單的記憶順序是memory_order_seq_cst
,它可以爲您提供連續的一致性。其他的內存模型給予放鬆的momory排序。
如果你想獲得一個獲取釋放命令你預計合併: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;
}