gpt4 book ai didi

c++ - 从静态变量的析构函数调用的 Windows 7 上的 std::condition_variable notify() 问题

转载 作者:行者123 更新时间:2023-12-03 13:07:34 28 4
gpt4 key购买 nike

当从静态变量的析构函数调用时,我在 Windows 7 上遇到了 std::conditional_variable notify()notify_all() 问题。

对象看起来像这样(逻辑被简化):

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:
...
bool m_stop;
std::mutex m_workQueueSync;

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

SomeObject——是一个静态变量。

当我们调用 ~SomeObject() - m_thread 已经停止。但是在 Windows 7 上我们遇到了问题。

在调用栈的顶部:(这是应用程序的唯一线程)

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

我知道,静态对象的析构函数中的同步 - 不好的做法(这是遗留代码)有很多方法可以修复它。

但是,这似乎是在 Win 7 的 140 运行时中执行 STL 的一个错误(在 Win 10 上一切正常)。如果是的话,我在互联网上找不到任何相关信息

更新:

在另一个项目中遇到过这个问题,所以对于可能遇到这个问题的任何人:

问题:似乎在 Win7 上执行条件变量存在一些问题(由于 Concurrency::details::STL_condition_variable_win7::notify_one() )

出现,当有一个条件变量时,等待该变量的线程,我想,由于某种原因终止(在我的例子中 - 由于进程关闭)

在这种情况下,std::conditional_variable::notify() 会导致挂起。

可能的解决方案

最好的解决方案 - 只是修复架构,因为静态对象中的线程 - 不是最好的方法。

另一种选择——使用 boost 代替 STL

最佳答案

我遇到了同样的问题,仅在 Windows 7 上。相同的代码在 Windows 10 上运行。当我们到达 notify_all(我的案例)或 notify_one(此处)时,似乎 STL condition_variable 的基础设施已经以某种方式被取消。

在我的例子中,有 8 个线程在等待,但当程序挂起时它们都死了,所以 notify_all 完成了它的工作但从未返回。在我的调用堆栈中有一个包含 win7 的函数名称,因此在 win7 和 win 10 中运行的代码很可能不同:

    ntdll.dll!ZwReleaseKeyedEvent()    Unknown
ntdll.dll!string "Enabling heap debug options\n"() Unknown
msvcp140d.dll!__crtWakeAllConditionVariable(_RTL_CONDITION_VARIABLE * pCond) Line 450 C++
msvcp140d.dll!Concurrency::details::stl_condition_variable_win7::notify_all() Line 188 C++
msvcp140d.dll!do_signal(_Cnd_internal_imp_t * cond, int all) Line 80 C++
msvcp140d.dll!_Cnd_broadcast(_Cnd_internal_imp_t * cond) Line 101 C++
cvie64.dll!std::condition_variable::notify_all() Line 596 C++
cvie64.dll!ctpl::thread_pool::interrupt(bool kill) Line 166 C++

关于c++ - 从静态变量的析构函数调用的 Windows 7 上的 std::condition_variable notify() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60452341/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com