C++之std::condition_variable::wait_for
Aria
下载可以很简单
项目地址:https://gitcode.com/gh_mirrors/ar/Aria
免费下载资源
·
std::condition_variable::wait_for
是 C++11 引入的条件变量的一部分,用于在一定时间内等待通知。它是 std::condition_variable
类的成员函数之一,可以使线程在等待某条件变为真时,最多等待指定的时间段。
使用方法
在 std::condition_variable
中,wait_for
的主要形式如下:
cpp
template< class Rep, class Period >
std::cv_status wait_for( std::unique_lock<std::mutex>& lock,
const std::chrono::duration<Rep,Period>& rel_time );
template< class Rep, class Period, class Predicate >
bool wait_for( std::unique_lock<std::mutex>& lock,
const std::chrono::duration<Rep,Period>& rel_time,
Predicate pred );
- 第一种形式无谓词,等待特定的时间段或直到被其他线程通知。
- 第二种形式带有谓词,等待特定的时间段或直到谓词返回
true
。
参数说明
lock
:一个std::unique_lock<std::mutex>
对象,负责在等待期间持有互斥锁。rel_time
:等待的相对时间,是std::chrono::duration
类型。pred
:谓词(lambda 或可调用对象),用于判断条件是否满足。
返回值
- 如果无谓词版本的
wait_for
在指定时间段内被唤醒,则返回std::cv_status::no_timeout
;如果超时则返回std::cv_status::timeout
。 - 如果带有谓词的
wait_for
在指定时间段内被唤醒并且谓词返回true
,则返回true
;否则返回false
。
示例代码
以下是一个简单的示例,展示了如何使用 std::condition_variable::wait_for
来实现限时等待:
cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker() {
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one(); // 通知等待的线程
}
int main() {
std::thread t(worker);
std::unique_lock<std::mutex> lock(mtx);
if (cv.wait_for(lock, std::chrono::seconds(2), []{ return ready; })) {
std::cout << "Worker线程已完成工作。" << std::endl;
} else {
std::cout << "等待超时。" << std::endl;
}
t.join();
return 0;
}
在这个示例中:
worker
线程模拟了一些工作,睡眠 1 秒后设置ready
为true
并通知主线程。- 主线程启动
worker
线程并等待条件变量至多 2 秒,检查ready
是否变为true
。 - 如果在 2 秒内
ready
变为true
,则输出 "Worker线程已完成工作。",否则输出 "等待超时。" -
在调用
wait_for
函数时,会在内部解锁lock
,并在等待期间重新获取锁。这样做是为了避免死锁,并且符合条件变量的使用惯例。具体地说,
wait_for
函数会在等待之前释放lock
,使得其他线程可以在需要时获取该锁。当条件变量满足等待条件或超时后,wait_for
函数会重新获取lock
,并继续执行。因此,在使用
wait_for
函数时,无需手动在等待之前释放锁或在等待结束后重新获取锁,这些操作都由wait_for
函数在内部处理。
通过这个示例,可以看到 std::condition_variable::wait_for
如何用于实现限时等待和条件判断,从而使得多线程编程更加灵活和高效。
GitHub 加速计划 / ar / Aria
5.52 K
861
下载
下载可以很简单
最近提交(Master分支:3 个月前 )
b0d3c6dd - 5 个月前
8fd9634d - 5 个月前
更多推荐
已为社区贡献5条内容
所有评论(0)