std::shared_future
这个对象的get()可以调用多次
int run1( ){
cout<<"thread_id : "<<std::this_thread::get_id()<<endl;
for(int i=1;i<=1e2;i++){
cout<<1;
}
std::chrono::seconds dura(2);//等待5秒
std::this_thread::sleep_for(dura);//休息dura秒
return 666;
}
int main(){
cout<<"main_thread_id : "<<std::this_thread::get_id()<<endl;
std::future<int> res = std::async(std::launch::deferred,ref(run1) );//流程不会卡在这里
cout<<"continue...!"<<endl;
//std::shared_future<int> res2(res.share());
std::shared_future<int> res2( std::move(res) );//这两种方式执行后,res对象就为空了
cout<<"I ...";
return 0;
}
valid()
valid函数:检查共享状态的有效性,返回当前的future对象是否与共享状态关联。一旦调用了std::future::get()函数,再调用此函数将返回false。
std::atomic
原子操作 : 不需要用互斥量加锁的多线程并发编程方式 , 即在多线程中不会被打断的程序执行片段
原子操作一般针对的是一个变量 , 而不是一个代码段
std::atomic
来代表原子操作 ,std::atomic
是个类模板,这个东西是用来封装某个
std::atomic<int> cnt=0;
cnt++;
cnt--;
//一般原子操作,针对++,--,+=,-=,&=,|=,^=是支持的,其他的可能不支持
std::recursive_mutex
递归的独占互斥量 : 允许同一个线程,同一个互斥量可以被锁多次
std::timed_mutex
带超时功能的独占互斥量
try_lock_for()
: 等待一段时间(时间段) , 如果拿到锁了 , 或者超过等待时间没拿到锁 , 线程流程就走下来std::chrono::seconds timeout(1s); if(mymutex.try_lock_for(timeout)){ dui.push(i); mymutex.unlock();//还是要记得解锁 }else{ //没拿到锁头 }
try_lock_unti()
: 等待的是一个时间点 , 在未来的时间没到拿到了锁 , 那么就走下来 , 如果时间到了 , 没拿到锁 , 也走下来std::chrono::seconds timeout(1s); if(mymutex.try_lock_until(chrono::steady_clock::now()+timeout)){ dui.push(i); mymutex.unlock(); }else{ //没拿到锁头 }
std::recursive_timed_mutex
带超时功能的递归独占互斥量