Рассмотрим следующий пример (блокировка защиты на cout
опущена для простоты).
#include <future>
#include <iostream>
#include <thread>
using namespace std;
struct C
{
C() { cout << "C constructor\n";}
~C() { cout << "C destructor\n";}
};
thread_local C foo;
int main()
{
int select;
cin >> select;
future<void> f[10];
for ( int i = 0;i < 10; ++i)
f[i] = async( launch::async,[&](){ if (select) foo; } );
return 0;
}
В обоих случаях clang и gcc эта программа ничего не выводит, если пользователь пишет "0", в то время как он печатает Constructor
/Destructor
10 раз, если пользователь вводит ненулевой номер.
Кроме того, clang жалуется на очевидный результат неиспользованного выражения.
Поскольку срок службы thread_local
должен охватывать весь ресурс, я ожидал, что переменная foo
будет инициализирована в каждом потоке независимо от ввода пользователя.
Мне может понадобиться переменная thread-local
с единственной целью иметь побочный эффект в конструкторе, соответствует ли стандартное требование инициализации объекта thread_local
при его первом использовании?