c ++: этот метод getInstance () моего одноэлементного потока безопасен? - PullRequest
2 голосов
/ 25 мая 2011

В настоящее время я пытаюсь написать потокобезопасный синглтон (по крайней мере, с точки зрения построения и разрушения), используя boost :: mutex.Я прочитал, что boost mutex не может быть инициализирован статически (я потерял ссылку, где я его читал, извините), поэтому, чтобы обойти это, я попробовал это, если потокобезопасность для строительства и разрушения:этот потокобезопасный, или я должен использовать boost :: call_once?Будет ли повышение, как только даст мне какое-либо преимущество в производительности по сравнению с этим подходом?

РЕДАКТИРОВАТЬ: Хорошо, моя первая идея была явно не правильной.Чтобы прояснить вопрос.Может ли boost :: mutex безопасно инициализироваться статически?Как это:

class Singleton
{
private:
static boost::mutex m_mutex;

public:
static Singleton & getInstance()
{
    boost::lock_guard lock(m_mutex);
    static T instance;
    return instance;
}

};

Это рабочий подход или на самом деле небезопасно инициировать boost :: mutex статически (это то, что я прочитал)?

EDIT2 : Ах, это была ссылка между прочим http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

Поскольку каждая запись в функции будет создавать свою собственную блокировку, блокировка будет полностью бесполезной;любое количество потоков может войти в функцию, заблокировать различные блокировки и одновременно начать связываться со статическими данными.

Вы можете создать блокировку на уровне файла (или статического класса);это гарантирует, что он будет создан вовремя, при условии, что вы не запускаете потоки до main().Однако это также сериализовало бы ввод в функцию даже после инициализации статических данных.

Почему бы просто не определить ваши статические данные в файловой (или статической) области видимости в первую очередь?

1 голос
/ 25 мая 2011

GCC обеспечивает поточно-ориентированную инициализацию статических переменных.Таким образом, если вы используете GCC, вам не нужно заботиться о правильной инициализации статических переменных

0 голосов
/ 25 мая 2011

Вам нужно использовать блокировку.Однако предложенная вами схема boost::mutex не работает, поскольку вы выделяете мьютекс в стеке, и каждый из нескольких одновременных вызывающих абонентов получает свой собственный мьютекс.

...