future其他成员函数,shared_future,atomic

张开发
2026/4/22 17:26:49 15 分钟阅读
future其他成员函数,shared_future,atomic
一.std::future的其他成员函数1.std::future_status是一个枚举类型表示等待的状态有三个值future_status::timeout表示线程没执行完int print1(int val) { cout 线程print1开始id this_thread::get_id() endl; this_thread::sleep_for(chrono::seconds(2)); //休息2秒 cout 线程print1结束id this_thread::get_id() endl; return val; //返回值 } cout 主线程开始id this_thread::get_id() endl; futureintresult async(print1, 5); //异步任务在主线程返回之前会一直等待该线程执行完毕 future_status status result.wait_for(chrono::seconds(1)); //等待1秒线程没执行完 if (status future_status::timeout) { cout 线程没执行完 endl; }future_status::ready表示线程已经成功返回futureintresult async(print1, 5); //异步任务在主线程返回之前会一直等待该线程执行完毕 future_status status result.wait_for(chrono::seconds(3)); //等待3秒线程执行完 if (status future_status::ready) { cout 线程成功返回 endl; }future_status::deferred如果async的第一个参数为std::launch::deferred这个条件就成立表示线程被延迟执行不调用get()不执行。futureintresult async(launch::deferred,print1, 5); //异步任务在主线程返回之前会一直等待该线程执行完毕 future_status status result.wait_for(chrono::seconds(3)); //等待3秒 if (status future_status::deferred) { cout 线程被延迟执行 endl; cout result.get() endl; }2.valid()判断future对象是否有值有返回true没有返回false二.std::shared_futurefuture对象的get()函数是一个移动语义调用get()后原future对象里数据为空所以不能调用第二次get()。shared_future也是一个类模板但它的get()函数是复制数据而不是移动数据所以可以多次调用get()。int main() { cout 主线程开始id this_thread::get_id() endl; packaged_taskint(int) p(print1); thread t1(ref(p), 1); t1.join(); shared_futureintresult p.get_future(); //成员函数get_future()保存的是p里面的被包装的入口函数返回的值 shared_futureintresult_s(move(result)); //或shared_futureintresult_s(result.share()); 两种写法执行都result里都为空result_s有值 cout 第一次get: result_s.get() endl; cout 第二次get: result_s.get() endl; std::cout 主线程结束 std::endl; return 0; }三.原子操作std:atomic概念两个或多个线程同时对共享数据进行操作时可能出现互相打断对方操作的情况导致结果出错。这样就需要在操作时对代码段加锁或者用原子操作的方法。原子操作可以理解为不需要加互斥量无锁技术的多线程并发编程方式效率上比用互斥量更高或者在多线程中不会被打断的程序执行片段。互斥量加锁一般是针对代码段而原子操作针对的一般是一个变量。语法std::atomic是一个类模板。std::automic数据类型 变量名; //定义一个具备原子操作能力的变量可用的操作符赋值操作符operator(T desired)— 原子赋值store(desired)operator(const atomic) delete— 拷贝赋值被删除原子类型不可拷贝2. 读取操作符operator T() const— 原子读取load()3. 算术操作符仅对整型和指针特化operator()/operator(int)— 前置/后置自增fetch_add(1)operator--()/operator--(int)— 前置/后置自减fetch_sub(1)operator (T val)— 原子加fetch_add(val)operator- (T val)— 原子减fetch_sub(val)operator (T val)— 原子按位与fetch_and(val)C20operator| (T val)— 原子按位或fetch_or(val)C20operator^ (T val)— 原子按位异或fetch_xor(val)C204. 指针特化的偏移操作符operator (ptrdiff_t)— 原子指针加法operator- (ptrdiff_t)— 原子指针减法示例1:错误不使用automic或者互斥锁结果可能出错#includeiostream #includethread #includelist #includemutex #includefuture #includemap #includevector using namespace std; void plus1(int val) { for (int i 0; i 10000000; i) { val;//不支持valval1; } } int main() { cout 主线程开始id this_thread::get_id() endl; int val 0; thread t1(plus1, ref(val)); thread t2(plus1, ref(val)); t1.join(); t2.join(); cout val endl; std::cout 主线程结束 std::endl; return 0; }示例2使用atomic#includeiostream #includethread #includelist #includemutex #includefuture #includemap #includevector #includeatomic using namespace std; void plus1(atomicint val) { for (int i 0; i 10000000; i) { val;//不支持valval1; } } int main() { cout 主线程开始id this_thread::get_id() endl; atomicint val 0; thread t1(plus1, ref(val)); thread t2(plus1, ref(val)); t1.join(); t2.join(); cout val endl; std::cout 主线程结束 std::endl; return 0; }

更多文章