6

考虑使用g++ -std=c++11(GCC 4.7.2) 编译此函数:

boost::uuids::uuid getID()
{
    static boost::uuids::random_generator generator;
    return generator();
}

getID从多个线程调用是否安全?

正如这里提到的,根据 C++11 标准,第一行的本地静态对象定义是线程安全的。问题是第二行boost::uuids::random_generator::operator()对同一对象的调用generator是否也是线程安全的。返回的 UUID 在它们在单个线程中的意义上是否是唯一的?

4

2 回答 2

4

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

于 2014-05-28T09:08:09.560 回答
2

boost::uuids::random_generator如boost Uuid 库的文档中所述,它不是线程安全的(它不能在没有同步的情况下共享) :

类与 int 一样是线程安全的。也就是说,如果没有适当的同步,实例就不能在线程之间共享。

于 2019-05-13T13:27:45.740 回答