std::condition_variable::notify_one()、wait()的作用,用示例说明
时间: 2024-05-07 10:16:07 浏览: 12
std::condition_variable是C++11标准库中的一个线程同步原语,用于实现线程间的同步和通信。其中,notify_one()和wait()是它的两个重要成员函数。
notify_one()函数用于唤醒一个处于阻塞状态的线程,让其继续执行。如果当前没有线程处于阻塞状态,则该函数不会做任何操作。以下是一个简单的示例:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void thread_func(int id) {
std::unique_lock<std::mutex> lock(mtx);
while (!ready) {
std::cout << "Thread " << id << " is waiting..." << std::endl;
cv.wait(lock);
}
std::cout << "Thread " << id << " is running." << std::endl;
}
int main() {
std::thread t1(thread_func, 1);
std::thread t2(thread_func, 2);
std::this_thread::sleep_for(std::chrono::seconds(1));
ready = true;
cv.notify_one();
t1.join();
t2.join();
return 0;
}
```
在上面的示例中,有两个线程(t1和t2)在等待条件变量(cv)被唤醒。当ready变量被设置为true时,主线程调用notify_one()函数唤醒一个处于阻塞状态的线程,这里是t1。被唤醒的线程会重新尝试获取锁,如果成功则继续执行,否则又会被阻塞。
wait()函数用于使当前线程阻塞等待某个条件变量被唤醒。该函数需要传入一个互斥量(mutex)作为参数,因为在等待过程中需要对共享资源进行加锁。以下是一个简单的示例:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void thread_func() {
std::unique_lock<std::mutex> lock(mtx);
while (!ready) {
std::cout << "Thread is waiting..." << std::endl;
cv.wait(lock);
}
std::cout << "Thread is running." << std::endl;
}
int main() {
std::thread t(thread_func);
std::this_thread::sleep_for(std::chrono::seconds(1));
ready = true;
cv.notify_one();
t.join();
return 0;
}
```
在上面的示例中,有一个线程(t)在等待条件变量(cv)被唤醒。当ready变量被设置为true时,主线程调用notify_one()函数唤醒这个线程,让它继续执行。需要注意的是,在调用wait()函数时,线程会自动释放锁,等到被唤醒后再重新获取锁。