2016-12-18 75 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,但是讀到互斥量很慢。

回答

3

你的兩段代碼做兩個不同的東西。

id++; 
return id.load(); 

該代碼增加id,然後返回增加的值。

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

代碼遞增之前返回值

正確的代碼做要做的第一嘗試是

return ++id; 

正確的代碼做第二次卻是什麼

return id++;