📅  最后修改于: 2023-12-03 15:22:05.283000             🧑  作者: Mango
休息队列(sleep queue)是一种常用于线程同步的数据结构,在多线程编程中被广泛使用。它允许线程在某些条件不满足时进入等待状态,直到条件被满足并唤醒,从而实现线程之间的同步。
在 C++ 中,STL 提供了一个标准的休息队列实现,即 std::condition_variable。它提供了两个核心函数:wait 和 notify_one / notify_all。
此外,std::condition_variable 还支持自定义谓词,用于更精确地控制线程的等待和唤醒。
下面是一个简单的示例,演示了如何使用 std::condition_variable 实现线程同步。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
// 线程 A
void print_number(int n)
{
std::unique_lock<std::mutex> lck(mtx);
while (!ready) cv.wait(lck);
std::cout << "Thread A: " << n << std::endl;
}
// 线程 B
void prepare_number(int& n)
{
std::unique_lock<std::mutex> lck(mtx);
std::cout << "Thread B: preparing number..." << std::endl;
n = 42;
ready = true;
cv.notify_all();
}
int main()
{
int n = 0;
std::thread t1(print_number, n);
std::thread t2(prepare_number, std::ref(n));
t1.join();
t2.join();
return 0;
}
上述代码中,线程 A 等待线程 B 准备一个数字,并将其打印出来,线程 B 在准备完数字后将 ready 标记设为 true 并唤醒线程 A。
休息队列是多线程编程中常用的同步机制,在 C++ 中通过 std::condition_variable 实现。它提供了 wait 和 notify_one / notify_all 两个核心函数,以及自定义谓词控制线程的等待和唤醒,可以方便地实现线程之间的同步。