水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
1/1
|
转到
主题:一个关于condition_variable问题
楼主
|
xunery
|
2021-10-14 00:54:53
|
只看此ID
#include <mutex>
#include <condition_variable>
class Event {
public:
Event() {};
~Event() {};
bool wait(std::chrono::milliseconds millisec) {
std::unique_lock<std::mutex> l(m_lock);
auto cv = m_cond.wait_for(l, millisec);
if (cv == std::cv_status::no_timeout) {
return true;
}
return false;
};
void notify() {
m_cond.notify_all();
};
private:
std::mutex m_lock;
std::condition_variable m_cond;
};
class MyClass
{
public:
MyClass() {};
~MyClass() {};
void start() {
std::thread run_thread(std::bind(&MyClass::run, this));
run_thread.detach();
};
void run() {
while (true)
{
if (m_event.wait(std::chrono::milliseconds(500)))
{
printf("end thread!\n");
break;
}
else
{
printf("do something,continue thread!\n");
continue;
}
}
};
void stop() {
m_event.notify();
};
private:
Event m_event;
};
int main()
{
MyClass test;
test.start();
std::this_thread::sleep_for(std::chrono::milliseconds(1000*10));
printf("before stop!\n");
test.stop();
system("pause");
return 0;
}
上面这段代码,本意是想当调用stop的时候通知线程退出,但是实际情况是不到调用stop之前,线程就被通知退出了。而且退出时机是随机的,有时早有时晚,可能是我对condition_variable理解的不够,请问哪里的问题。谢谢
--
FROM 124.126.202.*
1楼
|
Bernstein
|
2021-10-14 04:18:52
|
只看此ID
你自己找一个经典的条件变量例子程序看一下,就知道了
比如
https://en.cppreference.com/w/cpp/thread/condition_variable
条件变量存在所谓假唤醒问题,所以唤醒后要检查是否满足特定条件,否则要继续休眠;
因此wait_for需要传递第三个参数,是一个lambda,检测条件是否满足,满足则返回true
【 在 xunery 的大作中提到: 】
: #include <mutex>
: #include <condition_variable>
:
: ...................
--
FROM 221.218.210.*
2楼
|
xunery
|
2021-10-14 12:24:38
|
只看此ID
“条件变量存在所谓假唤醒问题”
这个说法有文档支撑吗?我从没在哪个文档看到这个说法。另外,我现在就是想问的两参数wait_for的情况为何会有这种问题
【 在 Bernstein 的大作中提到: 】
: 你自己找一个经典的条件变量例子程序看一下,就知道了
: 比如
https://en.cppreference.com/w/cpp/thread/condition_variable
: 条件变量存在所谓假唤醒问题,所以唤醒后要检查是否满足特定条件,否则要继续休眠;
: ...................
--
FROM 124.126.202.*
3楼
|
Bernstein
|
2021-10-14 12:40:34
|
只看此ID
有的,我发的链接里就有提到
两参数的接口,你需要自己检查,不符合条件的话,重新获取锁并再次调用wait_for;实际上需要一个while循环,或者说自己来实现一个三参数的版本
【 在 xunery 的大作中提到: 】
: “条件变量存在所谓假唤醒问题”
: 这个说法有文档支撑吗?我从没在哪个文档看到这个说法。另外,我现在就是想问的两参数wait_for的情况为何会有这种问题
--
FROM 221.218.210.*
4楼
|
xunery
|
2021-10-14 12:53:19
|
只看此ID
谢谢,我知道两参数+while的用法以及三参数的用法,我以为单纯两参数可以省掉那个判断条件,看来理解有误。那wait_for两参数版本如果不配合while+判断条件的话,是不能单独使用的吧。
它这种假唤醒在返回值上一点都不反映,当时我觉得即使有其他原因唤醒,在返回值也应该有所区别
【 在 Bernstein 的大作中提到: 】
: 有的,我发的链接里就有提到
: 两参数的接口,你需要自己检查,不符合条件的话,重新获取锁并再次调用wait_for;实际上需要一个while循环,或者说自己来实现一个三参数的版本
:
--
修改:xunery FROM 124.126.202.*
FROM 124.126.202.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版