Безопасен ли поток boost::uuids::random_generator?

Считайте, что эта функция компилируется с 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 уникальными в том смысле, что они будут в одном потоке?

1 ответ

Согласно этой теме генераторы случайных чисел не являются полностью поточно-ориентированными. Я попытался использовать этот класс способом, похожим на вашу реализацию. Я получаю сбои каждые несколько часов, и генератор иногда возвращает "ноль" uuids, что-то вроде 0000-0000-000 - вы понимаете. Хотя это не задокументировано, я бы предположил, что этот класс не является потокобезопасным. Вам нужно либо создавать экземпляр генератора каждый раз, когда вы генерируете uuid, либо вы можете использовать mutex, чтобы сделать вызов getID() безопасным для потока, или вы можете создать один экземпляр генератора uuid для каждого потока. Все варианты должны работать нормально.

boost::uuids::random_generatorне является потокобезопасным (его нельзя использовать без синхронизации), как указано в документации для библиотеки boost Uuid:

Классы так же потокобезопасны, как и int. То есть экземпляр не может быть разделен между потоками без надлежащей синхронизации.

Другие вопросы по тегам