влияние на глобальные указатели при обновлении потоков - PullRequest
0 голосов
/ 25 января 2019

Меня беспокоит то, как это повлияет на глобальные указатели при доступе между потоками. Мой глобальный указатель был потокобезопасным классом. Из кода что будет влиять на глобальный указатель, когда updatethread() метод обновляет указатель новым указателем и workerthread() обращается к указателю. С какой синхронизацией я должен работать?

SomeCache* ptrCache = NULL;

    //worker thread
    void Workerthread(std::string strFileToWork)
    {
        while (std::getline(fileStream, strCurrent))
        {                   
            //worker thread accessing the global pointer
        if (ptrCache->SearchValue(strCurrent))
        {           
            iCounter++;
        }
        }
    }

    void updatethread()
    {
        //replace old cache with a new fresh updated.
        SomeCache* ptrOldCache = ptrCache;
        ptrCache = ptrNewCache;
    }

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Одно возможное решение с mutex es:

std::mutex ptrCacheMutex;
SomeCache* ptrCache = null_ptr;

void Workerthread(...)
{
    ...
    bool valueFound;
    {
        std::scoped_lock lk(ptrCacheMutex);
        valueFound = ptrCache && ptrCache->SearchValue(...);
    }
    if (valueFound)
        iCounter++;
    ...
}

void updatethread()
{
    ...
    {
        std::scoped_lock lk(ptrCacheMutex);
        auto ptrOldCache = std::exchange(ptrCache, ptrNewCache);
    }
    ...
}

Если ваш компилятор не поддерживает вывод аргументов шаблона, вы должны явно указать тип мьютекса: std::scoped_lock<std::mutex> ....

0 голосов
/ 25 января 2019

Поведение, вероятно, не определено, вы можете обратиться к этому ответу относительно ключевого слова volatile в C ++. https://stackoverflow.com/a/72617/10443813 Если используется ключевое слово volatile , до выполнения следующей строки используется старое значение, а после - новое значение. В противном случае поведение может зависеть от компилятора или от флага компиляции.

    ptrCache = ptrNewCache;
...