std :: conditional_variable notify () проблема на Windows 7, вызываемая из деструктора переменной stati c - PullRequest
0 голосов
/ 28 февраля 2020

Я столкнулся с проблемой с std :: conditional_variable notify () или notify_all () в Windows 7 при вызове из деструктора переменной stati c.

Объект выглядит следующим образом ( logi c упрощенно):

class SomeObject
{
public:
    ~SomeObject()
    {
        StopThreadAndWait();
    }

    void StopThreadAndWait()
    {
            /* some logic  */
            m_stop = true;
            m_procesTasks.notify_one(); // <- the problem is here

            if (m_thread.joinable())
                m_thread.join();
    }

private:
    ...
    std::atomic_bool m_stop;
    std::mutex  m_workQueueSync;

    std::thread m_thread;
    std::condition_variable m_procesTasks;
};

SomeObject - переменная состояния c.

Когда мы вызываем ~ SomeObject () - m_thread уже остановлен. Но в Windows 7 мы пришли к зависанию.

в верхней части callstack: (это ЕДИНСТВЕННЫЙ поток приложения)

ntdll.dll!ZwReleaseKeyedEvent()
ntdll.dll!RtlpWakeConditionVariable()
ntdll.dll!RtlWakeConditionVariable()
....
MSVCP140D.dll!Concurrency::details::stl_condition_variable_win7::notify_one()
....
ntdll.dll!RtlExitUserProcess()
...

Я знаю, что синхронизация в деструкторах of stati c objects - плохая практика (это устаревший код) Есть много способов исправить это.

Но, похоже, ошибка реализации STL в 140 времени выполнения для Win 7 ( На Win 10 все работает отлично). И если это так, я не могу найти что-нибудь об этом в inte rnet

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...