• std::condition_variable

仅限于和std::mutex一起使用

    只要符合互斥标准就能使用

    下面使用std::condition_variable等待处理数据

    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <condition_variable>
    #include <queue>
    
    class data_chunk {
    public:
        int val;
        int other;
    };
    std::mutex mtx;
    // 队列用于两个线程之间传递数据
    std::queue<data_chunk> data_queue;
    std::condition_variable data_cond;
    
    // 线程B执行
    void data_preparation_thread() {
        while (more_data_to_prepare()) {
            // 准备好数据 保护队列并压入数据
            data_chunk data = prepare_data();
            {
                std::lock_guard<std::mutex> lk(mtx);
                data_queue.push(data);
            }
            // 通知线程消费
            data_cond.notify_one();     // 唤醒一个线程
        }
    }
    
    // 线程A执行
    void data_processing_thread() {
        while (true) {
            std::unique_lock<std::mutex> lk(mtx);
            // lamda表达式指定需要等待成立的条件 
            // 若条件成立,wait返回,lk仍然被锁住
            // 若条件不成立,A先解锁,再继续等待。结束等待之后,重新加锁。
            data_cond.wait(lk,[]{
                return !data_queue.empty();
            });
            data_chunk data = data_queue.front();
            data_queue.pop();
            
            lk.unlock();    // 拿到数据拷贝后释放
            process(data);
            if (is_last_chunk(data)) break;
        }
    }
    
    int main() {
        return 0;
    }