考虑使用g++ -std=c++11
(GCC 4.7.2)编译此函数:
boost::uuids::uuid getID()
{
static boost::uuids::random_generator generator;
return generator();
}
从多个线程调用getID
是否安全?
如前所述here,根据C ++ 11标准,第一行的本地静态对象定义是线程安全的。问题是在第二行对同一对象boost::uuids::random_generator::operator()
的{{1}}调用是否也是线程安全的。返回的UUID是否会在单个线程中是唯一的?
答案 0 :(得分:3)
根据this topic,随机生成器不是完全线程安全的。我尝试以类似于您的实现的方式使用此类。我每隔几个小时发生一次撞击,发电机有时会返回“零”uuids,比如0000-0000-000 - 你明白了。虽然没有记录,但我认为这个类不是线程安全的。您必须在每次生成uuid时创建生成器实例,或者您可以使用mutex来调用getID()线程安全,或者您可以为每个线程创建一个uuid生成器实例。所有选项都应该可以正常工作。
答案 1 :(得分:1)
boost::uuids::random_generator
不是线程安全的(无法同步,无法共享),如documentation中关于Boost Uuid库的说明:
类与int一样具有线程安全性。那是没有适当同步就无法在线程之间共享实例。