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()問題は、2 行目の同じオブジェクトに対する呼び出しgeneratorもスレッドセーフかどうかです。返された UUID は、単一のスレッドにあるという意味で一意になりますか?

4

2 に答える 2

4

このトピックによると、ランダム ジェネレーターは完全にスレッド セーフではありません。このクラスを実装と同様の方法で使用してみました。私は数時間ごとにクラッシュし、ジェネレーターは 0000-0000-000 のような "ゼロ" uuid を返すことがあります。文書化されていませんが、このクラスはスレッドセーフではないと思います。uuid を生成するたびにジェネレーター インスタンスを作成するか、mutex を使用して getID() の呼び出しをスレッド セーフにするか、スレッドごとに uuid ジェネレーターのインスタンスを 1 つ作成する必要があります。すべてのオプションが正常に機能するはずです。

于 2014-05-28T09:08:09.560 に答える