Я столкнулся с проблемой с 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