C++并发多线程--std::future_status、std::shared_future和std::atomic的使用

1--std::future_status的使用

        std::future_status成员函数含有三种状态:timeout(执行超时)、ready(执行完毕)和deferred(延迟执行),其中 deferred 状态需要用 std::launch::deferred 对线程进行设置,使其延迟直到 get() 或者 wait() 被调用;

#include <iostream>
#include <thread>
#include <mutex>
#include <future>
 
class Sample{
public:
    // 线程入口函数
    int thread(int value){
        std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
        std::chrono::seconds dura(value); // rest
        std::this_thread::sleep_for(dura);
        return 5;
    }
 
};
 
int main(int argc, char *argv[]){
    Sample sample;
    int value = 5;
    std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
    std::future<int> result = std::async(&Sample::thread, &sample, value);

    // 等待1s
    std::future_status status = result.wait_for(std::chrono::seconds(1));

    if (status == std::future_status::timeout){ // 超时,因为线程里面睡眠了5s
        // if判断为true,表明线程还没执行完,超时了
        std::cout << "thread timeout!" << std::endl;
    }
    else if(status == std::future_status::ready){ // 线程在等待期间成功返回
        std::cout << "result.get(): " << result.get() << std::endl;
    }
    // std::launch::deferred设置延迟执行状态
    // std::future<int> result = std::async(std::launch::deferred, &Sample::thread, &sample, value);
    else if(status == std::future_status::deferred){ // 延迟执行状态
        std::cout << "deferred, result.get(): " << result.get() << std::endl;
    }
 
    std::cout << "main thread continue ..." << std::endl;
    return 0;
}

2--std::shared_future的使用

        由于 std::future 对象只能被 get() 一次(get()的实现基于移动语义),当多个线程都需要 std::future 对象 get() 的结果时,就会出错;

        std::shared_future 对象可以很好地解决上述问题;

#include <iostream>
#include <thread>
#include <mutex>
#include <future>
 
// 线程入口函数
int thread(int value){
    std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
    std::chrono::seconds dura(value); // rest
    std::this_thread::sleep_for(dura);
    return 5;
}
 
int main(int argc, char *argv[]){
    // std::packaged_task 打包任务
    std::cout << "thead id: " << std::this_thread::get_id() << std::endl;
    std::packaged_task<int(int)> mypt(thread);
    int value = 5;
    std::thread thread1(std::ref(mypt), value);
    thread1.join();
    // std::future<int> result = mypt.get_future(); // std::future对象
    std::shared_future<int> share_result(mypt.get_future()); // std::shared_future对象
    // 可以多次调用
    std::cout << "result.get(): " << share_result.get() << std::endl;
    std::cout << "result.get(): " << share_result.get() << std::endl;
    return 0;
}

3--std::atomic的使用

主要思路:

        

猜你喜欢

转载自blog.csdn.net/weixin_43863869/article/details/132385972