bthread::CountdownEvent

bthread::CountdownEvent 作用

bthread::CountdownEvent 是一个在百度的 bthread 库中用于线程同步的计数器工具。它可以用来等待一组线程完成他们的任务。

主要的使用方法是这样的:
初始化一个 CountdownEvent 对象,并设置一个初始计数值。
每当一个线程开始执行它的任务时,不需要做任何操作。
当该线程即将结束它的任务时,它可以调用 CountdownEvent 的 decrease_count() 方法来表示它已经完成了它的任务。
在等待线程完成的线程(或者说主线程)中,调用 wait() 方法。这个方法会阻塞调用线程,直到 CountdownEvent 的计数值降到0。

下面是一个简单的例子:

#include <bthread/countdown_event.h>
#include <iostream>
#include <vector>
 
void task(bthread::CountdownEvent* cnt, int id) {
    // 模拟任务执行
    std::this_thread::sleep_for(std::chrono::seconds(1));
 
    // 表示任务完成
    cnt->decrease_count();
}
 
int main() {
    const int task_count = 5;
    bthread::CountdownEvent cnt(task_count);
 
    std::vector<std::thread> threads;
    for (int i = 0; i < task_count; ++i) {
        threads.emplace_back(task, &cnt, i);
    }
 
    // 等待所有任务完成
    cnt.wait();
 
    // 输出信息
    std::cout << "All tasks have completed." << std::endl;
 
    // 结束线程
    for (auto& t : threads) {
        t.join();
    }
 
    return 0;
}

在这个例子中,我们创建了5个线程,每个线程执行一个模拟任务,每个任务完成后,通过调用 decrease_count() 方法来表示它已经完成。在主线程中,我们调用 cnt.wait() 来等待所有的任务完成。当所有的任务完成后,wait() 方法返回,主线程继续执行。

bthread::CountdownEvent signal函数作用

bthread::CountdownEvent::signal 是一个在 bthread 库中使用的函数,它的作用是将 CountdownEvent 对象的内部计数器减少1。如果减少后的计数器值为0,则唤醒所有等待该事件的线程。

下面是一个简单的示例,展示如何使用 bthread::CountdownEvent 和 signal 函数:

#include <bthread/countdown_event.h>
#include <iostream>
 
void wait_for_signal() {
    bthread::CountdownEvent event(1); // 初始计数为1
 
    // 模拟异步操作完成,发送信号
    std::cout << "异步操作完成,发送信号..." << std::endl;
    event.signal(); // 计数器减1
 
    // 等待信号
    std::cout << "等待事件触发..." << std::endl;
    event.wait(); // 如果计数器不为0,则等待
 
    std::cout << "事件已触发,继续执行后续操作。" << std::endl;
}
 
int main() {
    wait_for_signal();
    return 0;
}

在这个例子中,我们创建了一个 CountdownEvent 对象,并将其计数器初始化为1。然后我们模拟了一个异步操作完成并发送信号的过程,通过调用 signal 函数将计数器减少。随后我们调用 wait 函数等待事件触发,因为信号已经发送,所以不会发生等待。最后,我们输出一条信息表示事件已触发,并继续执行后续操作。

posted @ 2024-06-28 15:03  小海哥哥de  阅读(38)  评论(0编辑  收藏  举报