boost :: uuids :: random_generator线程是否安全?

时间:2013-09-19 08:59:50

标签: c++ c++11 gcc4.7 boost-random boost-uuid

考虑使用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是否会在单个线程中是唯一的?

2 个答案:

答案 0 :(得分:3)

根据this topic,随机生成器不是完全线程安全的。我尝试以类似于您的实现的方式使用此类。我每隔几个小时发生一次撞击,发电机有时会返回“零”uuids,比如0000-0000-000 - 你明白了。虽然没有记录,但我认为这个类不是线程安全的。您必须在每次生成uuid时创建生成器实例,或者您可以使用mutex来调用getID()线程安全,或者您可以为每个线程创建一个uuid生成器实例。所有选项都应该可以正常工作。

答案 1 :(得分:1)

boost::uuids::random_generator不是线程安全的(无法同步,无法共享),如documentation中关于Boost Uuid库的说明:

  

类与int一样具有线程安全性。那是没有适当同步就无法在线程之间共享实例。