2016-09-25 8 views
3
std::atomic<int> unique_ids; 

void foo() {  
    int i = unique_ids.fetch_add(1, std::memory_order_relaxed); 
    std::cout<<i; 
} 

int main(int argc, char* argv[]) { 
    std::vector<std::thread> threads; 
    for (int i = 0; i < 9; ++i) { 
     threads.emplace_back(foo); 
    } 

    for (int i = 0; i < 9; ++i) { 
     threads[i].join(); 
    } 
    std::cout << std::endl; 
    return 0; 
} 

私の目的は、並行プログラムの一意のIDを生成するためにアトミックを使用することですが、私はその命令を気にしません。C++でリラックスしたメモリの順序を理解する

上記のコードでは、fooの出力値はその順序が保証されていないにもかかわらず異なるはずです。

私は上記のコードを100回テストしましたが、結果はすべて私が期待したものです。私は原子/記憶秩序の初心者です。私の理解を明確にするのに誰も助けてくれますか?

ありがとうございます。 Aimin

P.S.この質問は、私の質問が原子とメモリの順番の説明に関する一般的な質問ではなく、memory_order_relaxedの理解に関するものであるため、c++,std::atomic, what is std::memory_order and how to use themと同じではないことを指摘したいと思います。

+2

@πάνταῥεῖこれは 'memory_order_relaxed'ではなく' memory_order'です。 – nbro

+3

@πάνταῥεῖ私の質問は、[C++、std :: atomic、std :: memory_orderとは何か、そしてそれらを使う方法と同じではないと思います(http://stackoverflow.com/questions/9553591/c-stdatomic私の質問は特にmemory_order_relaxedの理解に関するものであるからです。ありがとう。 –

+0

@πάνταῥεῖこれは一般的な概念ではなく、特定の問題に関するものです。ダップクロージャが間違っています。 – 2501

答えて

2

これは、緩やかなメモリの順序付けを正当に使用するためのものです。非常に同じアトミックに他のアクセスを行う場合には、操作がアトミックでなければなりません。すべてのアトミック操作は、メモリの順序付けに関係なくその特性を持ちます。まったくアトミックではありません。

+0

std :: atomic unique_ids; for(int i = 0; i <10; ++ i){ unique_ids.fetch_add(1、std :: memory_order_relaxed); } int ten = unique_ids.load(std :: memory_order_release); 理解に基づいて、変数10は10であることが保証されていると思いますか? –

+0

@AiminHuang 'unique_ids'がゼロから始まると仮定します。初期化しないとゼロに設定されることが保証されているかどうかは思い出せません。 –

+0

ご清聴ありがとうございます。自分のコード内でunique_idsを初期化します。 :) –

関連する問題