Я изучаю параллелизм в C ++, и я хочу знать, как я могу обновить значение локального хранилища потока? Вот простой пример
struct ThreadPool
{
std::vector<std::thread> threads;
std::atomic_bool done;
static thread_local std::unique_ptr<int> valueLocal;
const uint8_t nbThread = 1; //Just for example
ThreadPool()
{
done = false;
for (unsigned i = 0; i < nbThread; ++i)
{
threads.push_back(
std::thread(&ThreadPool::WorkerThread, this));
}
}
void WorkerThread()
{
while (!done)
{
std::cout << "WorkerThread " << std::this_thread::get_id() << " : " << valueLocal <<std::endl;
}
}
void UpdateValue(int value)
{
std::cout << "Update value " << std::this_thread::get_id() << " : " << valueLocal << std::endl;
valueLocal ++;
}
};
thread_local std::unique_ptr<int> ThreadPool::valueLocal = std::make_unique<int>(100);
Я пытаюсь создать пул потоков с локальным хранилищем значений 100, затем я пытаюсь обновить это значение в функции UpdateValue
Но поскольку Адрес localValue в функции UpdateValue и адрес в потоке не совпадают, я не могу обновить значение в указанном потоке c. Так как же мне go потоку обновить значение?
Следующая идея - дать каждому потоку пула потоков свой собственный вектор данных для функции использования, но сейчас я попробую простой пример
Большое спасибо!
Редактировать, чтобы ответить на вопрос
Спасибо за ваш ответ
@ Шефф действительно их проблема .. но компилятор не поднял и ошибка
@ besmirched: На самом деле я читаю книгу "Параллельность в действии в C ++" по главе "Пул потоков"
Для каждого автора создайте «поток локальной очереди» для каждого потока, но затем после того, как он пытается передать функцию, он сделал то же самое, что и я ..
Таким образом, он может «обновить значение» локальной переменной потока в потоке , Поэтому он совершил большую ошибку, или я не понимаю его логики c ..
Я не знаю, смогу ли я скопировать его код здесь ...