2011-10-09 24 views
2

有沒有一個表格來總結記憶順序的差異? 如何使用每個內存順序memory_order_seq_cst與其他內存順序有什麼區別?

此外,內存順序和(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 

回答

2

內存命令用於指定原子操作中的內存排序。最簡單的記憶順序是memory_order_seq_cst,它可以爲您提供連續的一致性。其他的內存模型給予放鬆的momory排序。

如果你想獲得一個獲取釋放命令你預計合併:memory_order_consumememory_order_acquirememory_order_releasememory_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; 
} 
相關問題