- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当从静态变量的析构函数调用时,我在 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/
此代码是实际项目代码的简化。主线程创建工作线程并使用 std::condition_variable 等待工作线程真正启动。在下面的代码中,std::condition_variable 在 curr
reference I'm using用以下方式解释这两者: wait_for "阻塞当前线程,直到条件变量被唤醒或在指定的超时时间之后" wait_until "阻塞当前线程,直到条件变量被唤醒或到
标题问题的较长版本是: On my machine, sizeof(std::condition_variable) is 72 bytes.What are these 72 bytes used
假设我有这样的事情: bool signalled = false; std::condition_variable cv; void thread1() { while (true) {
我在下面的代码中遇到错误。 recursive_mutex m_RecurMutex; condition_variable cond; unique_lock lock(m_RecurMutex);
这是什么: bool ready; boost::mutex mutex; boost::condition_variable cond; boost::unique_lock lock(mutex)
这个问题是关于condition_variable.wait()的功能。我认为它可能没有锁定 unique_lock当它被通知时立即。让我展示一下我的代码,您会更好地理解我的测试。 注意:编译器 g+
我是条件变量的新手,我想知道为什么计数器变量等于 99 之后的这段代码块?删除for循环并改用“counter += 99”使代码工作,它与sleep_for有什么关系吗?感谢您的帮助:) #incl
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
似乎 condition_variable notify_one 并不总是按应有的方式工作。 struct Task { std::mutex mutex; std::conditio
条件变量可用于向其他线程发出信号,表明发生了某些事情: mutex m; condition_variable cv; thread t1([&cv]{ // processing .
没有 std::condition_variable 的应用程序: #include #include #include #include #include #include std::m
首先是我的代码,让我的解释更清楚: struct Foo { std::condition_variable cv; }; static Foo* foo; // dynamically cr
std::condition_variable::notify_one() 或 std::condition_variable::notify_all() 是否保证非原子内存写入当前线程之前该调用将在
我目前正在对并发队列进行编程,同时学习如何使用C++ 11的多线程功能。 当使用者调用dequeue()函数且队列中没有任何条目时,该函数应等待,直到另一个线程调用enqueue()为止。我正在为此使
我有一个关于notify_one函数的问题。在下面的代码中, #include #include #include #include #include std::condition_vari
我有一个以下类(class)- boost::condition_varaible cond_; 当我尝试编译时- [rmitra @ butterfly boost] $ make EXE = th
这是一个小代码段 request_ptr pop() { request_ptr rp; std::unique_lock lock(cv_mtx); auto time =
假设我有一个包含std::queue的ThreadQueue类,并且我将每个std::ref的实例传递给线程。进一步假设,线程1(主线程)创建并保存ThreadQueue对象,并将消息倒入其中,第二个
我有课,用 queue的 std::function成员和方法 Push和 Pop . 我要实现加法PushAndWaitUntilExecuted .当你有一个时很容易consumer-thread
我是一名优秀的程序员,十分优秀!