📜  休息队列 stl - C++ (1)

📅  最后修改于: 2023-12-03 15:22:05.283000             🧑  作者: Mango

休息队列 STL - C++

介绍

休息队列(sleep queue)是一种常用于线程同步的数据结构,在多线程编程中被广泛使用。它允许线程在某些条件不满足时进入等待状态,直到条件被满足并唤醒,从而实现线程之间的同步。

在 C++ 中,STL 提供了一个标准的休息队列实现,即 std::condition_variable。它提供了两个核心函数:wait 和 notify_one / notify_all。

  • 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 两个核心函数,以及自定义谓词控制线程的等待和唤醒,可以方便地实现线程之间的同步。