2016-12-18 52 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++;