Копирование данных thread_local-переменной для новых потоков

Рейтинг: 0Ответов: 1Опубликовано: 29.06.2023

Всем привет. Мне потребовалось создать уникальный для разных потоков глобальный контейнер. Обратил внимание на thread_local. Однако существует проблема: мне необходимо, чтобы в новом потоке оставались элементы контейнера, добавленные в main потоке, а с thread_local я получаю пустой контейнер в новом потоке. Как мне сохранить данные из main потока для нового потока, чтобы дальше он мог с ними работать?

Приведу пример с глобальной переменной.

Имеем глобальную переменную thread_local int i = 0;, далее в main потоке сделали, к примеру, i = 5;
Затем создали новый поток. Мне необходимо, чтобы в этом новом потоке i == 5,
а не i == 0.

При этом, ни изменения этой переменной из main, ни из нового потока не должны влиять друг на друга (что и обеспечит thread_local)

Ответы

▲ 0

Сделать это несложно, однако требует использования динамической инициализации:

#include <thread>
#include <iostream>

int global{};
thread_local int threaded{global};

void worker()
{
    ::std::cout << threaded;
}

int main()
{
    global = 5;
    threaded = global;
    ::std::thread{&worker}.join();
}

online compiler