1.C++中使用条件变量的方法
在通常与互斥锁(std::mutex
)一起使用,允许线程在某些条件不满足时进入休眠状态,并在条件满足时被唤醒。
1. 包含必要的头文件
在C++中,条件变量定义在<condition_variable>
头文件中,因此需要包含该头文件:
#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>
2. 定义条件变量和互斥锁
条件变量需要与一个互斥锁一起使用,互斥锁用于保护共享资源的访问。通常使用std::mutex
作为互斥锁。
std::condition_variable cv;
std::mutex mtx;
bool ready = false; // 共享变量,表示条件是否满足
3. 等待条件
线程可以通过调用std::condition_variable::wait
或std::condition_variable::wait_for
方法来等待条件变量。wait
方法会阻塞当前线程,直到条件变量被通知。
void waiting_thread()
{
std::unique_lock<std::mutex> lock(mtx); // 加锁
cv.wait(lock, [] { return ready; }); // 等待条件变量,直到ready为true
std::cout << "Waiting thread is done waiting.\n";
}
4. 通知条件变量
当条件满足时,可以通过调用std::condition_variable::notify_one
或std::condition_variable::notify_all
方法来通知等待的线程。
-
notify_one
:唤醒一个等待的线程。 -
notify_all
:唤醒所有等待的线程。
void notifying_thread()
{
{
std::lock_guard<std::mutex> lock(mtx); // 加锁
ready = true; // 修改共享变量
} // 锁自动释放
cv.notify_one(); // 通知一个等待的线程
}
5. 完整示例代码
以下是一个完整的示例代码,展示了如何使用条件变量协调两个线程的行为:
#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>
std::condition_variable cv;
std::mutex mtx;
bool ready = false; // 共享变量,表示条件是否满足
void waiting_thread()
{
std::unique_lock<std::mutex> lock(mtx); // 加锁
cv.wait(lock, [] { return ready; }); // 等待条件变量,直到ready为true
std::cout << "Waiting thread is done waiting.\n";
}
void notifying_thread()
{
{
std::lock_guard<std::mutex> lock(mtx); // 加锁
ready = true; // 修改共享变量
} // 锁自动释放
cv.notify_one(); // 通知一个等待的线程
}
int main()
{
std::thread t1(waiting_thread); // 创建等待线程
std::thread t2(notifying_thread); // 创建通知线程
t1.join(); // 等待t1线程结束
t2.join(); // 等待t2线程结束
return 0;
}
2.数据库
CREATE TABLE student(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age INT