Обновление локального значения потока (параллелизм C ++) - PullRequest
0 голосов
/ 27 апреля 2020

Я изучаю параллелизм в 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 ..

Я не знаю, смогу ли я скопировать его код здесь ...

...