【问题标题】:Is boost::uuids::random_generator thread safe?boost::uuids::random_generator 线程安全吗?
【发布时间】:2013-09-24 06:46:58
【问题描述】:

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

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

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

正如here 所述,第一行的本地静态对象定义根据 C++11 标准是线程安全的。问题是在第二行对同一对象generatorboost::uuids::random_generator::operator() 调用是否也是线程安全的。返回的 UUID 在单个线程中是否是唯一的?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 据我所知,每次你需要一个新的 uuid 时创建一个 uuid 生成器的实例是一个错误的建议。
    • 我也这么说,因为如果你有两个不同的生成器,似乎有可能发生哈希冲突。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 2012-03-05
      • 2023-03-29
      • 1970-01-01
      • 2011-12-30
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多