2016-12-18 8 views
5

を返し、この思い付いた:アトミックインクリメントとユニークなID生成機能をしようとしてカウンター

std::atomic<int> id{0}; 
int create_id() { 
    id++; 
    return id.load(); 
} 

しかし、私は右、その関数が二度同じ値を返すようにするためにそれが可能だと仮定?たとえば、スレッドAは関数を呼び出し、値をインクリメントしますが、スレッドBが入っている間に停止し、値もインクリメントします。最後に、AとBの両方が同じ値を返します。

だから、ミューテックスを使用して、関数は次のようになります。

std::mutex mx; 
int id = 0; 
int create_id() { 
    std::lock_guard<std::mutex> lock{mx}; 
    return id++; 
} 

私の質問:それは唯一のアトミックを使用してカウンターからユニークなint型の値を産卵の動作を作成することは可能ですか?私が求めているのは、私がidをたくさん産み出す必要があるからですが、mutexが遅いのを読んでいるからです。

答えて

3

あなたの2つのコードスニペットは、2つの異なることを行う参照してください。

id++; 
return id.load(); 

コード増分idすなわち、インクリメント値を返します。コードは増加前の値を返し

std::lock_guard<std::mutex> lock{mx}; 
return id++; 

。何をすべきかを最初の試行行う

正しいコードが

return ++id; 

第が何を行うには、正しいコードが

return id++; 
あります
関連する問題