C++ 11 предлагает такие функции, как thread-safe initialization of static variables, и со ссылкой на этот вопрос, мы будем говорить, например:Предоставляются ли какие-либо гарантии безопасности потоков C++ 11 для сторонних библиотек потоков, скомпилированных/связанных с C++ 11?
Logger& g_logger() {
static Logger lg;
return lg;
}
Так якобы это справедливо независимо от того, является ли модуль скомпилирован с C++ 11 компилятора (?) включал заголовки нитей или порождал любые потоки в своем теле. Вам предлагается гарантия, даже если она была связана с другим модулем, который использовал потоки C++ 11 и вызвал функцию.
Но что, если ваш «другой модуль», который вызывает этот код, не использует потоки C++ 11, но что-то вроде Qt's QThread
. Является ли атомная инициализация статики тогда вне сферы возможностей C++ 11 сделать такую гарантию? Или сам факт того, что модуль, скомпилированный с C++ 11, а затем связанный с другим кодом C++ 11, подразумевает, что вы получите гарантию независимо?
Кто-нибудь знает хорошую ссылку, где покрыты такие проблемы?
Статическая инициализация - свойство языка. Я не вижу, как это может повлиять на конкретную библиотеку. – pmr
@pmr Мне кажется, что это немного сложно, потому что, например, память для вышеуказанного статического выделяется в начале программы, но конструктор запускается при первом вызове функции со статикой внутри нее. Казалось бы, для того, чтобы добиться этого, требуется всеведение в отношении модели потока нитей, поэтому я скептически отношусь к этому, если бы смешал QThread/C++ 11thread ... хотя есть небольшая вероятность появления новых бинарных требований, которые заставляют его работать , – HostileFork
@HostileFork: Пока оба (C++ и qt) используют одни и те же средства ОС для потоковой передачи, я не вижу, как что-то может пойти не так. Также я не понимаю, почему ни один из них не должен использовать средства потоковой передачи ОС. – PlasmaHH