Here is the rule issue std::memory_orderin C ++ 11 when it comes to three threads. Say a single thread producer saves a value and sets a flag. Then another relay flag waits for this flag before setting another flag. Finally, the third thread, the consumer, expects the relay flag , which should signal that it is dataready for the consumer .
Here is a minimal example-style program in the C ++ link ( http://en.cppreference.com/w/cpp/atomic/memory_order ):
#include <thread>
#include <atomic>
#include <cassert>
std::atomic<bool> flag1 = ATOMIC_VAR_INIT(false);
std::atomic<bool> flag2 = ATOMIC_VAR_INIT(false);
int data;
void producer()
{
data = 42;
flag1.store(true, std::memory_order_release);
}
void relay_1()
{
while (!flag1.load(std::memory_order_acquire))
;
flag2.store(true, std::memory_order_release);
}
void relay_2()
{
while (!flag1.load(std::memory_order_seq_cst))
;
flag2.store(true, std::memory_order_seq_cst);
}
void relay_3()
{
while (!flag1.load(std::memory_order_acquire))
;
data = data;
flag2.store(true, std::memory_order_release);
}
void consumer()
{
while (!flag2.load(std::memory_order_acquire))
;
assert(data==42);
}
int main()
{
std::thread a(producer);
std::thread b(relay_1);
std::thread c(consumer);
a.join(); b.join(); c.join();
}
Comments:
relay_1() assert . ++ memory_order_acquire ", , , ". , data=42 , flag2. memory_order_release, ", , ". data relay, , data , flag2==True.
relay_2(). - , " , std::memory_order_seq_cst". data.
- relay_2() ?
, data, relay_3(). data = data , data flag1 true, relay data, flag2. , .
. data = data -, ( ) .
? ++ 11 std::memory_order?
, . , data , i- (i + 1) - , ≤i.
Edit:
, relay_1() . , . ++ 11 , , - cppreference.com. , . , " " ( ) .