一、std::future的其他成员函数
//wait_for() 等待一定的时间
std::future_status status = result.wait_for(std::chrono::seconds(1)); //等待1秒
if (status == std::future_status::timeout) //超时,等你一秒钟,希望你返回,但是你没有
{
//表示线程还没执行完
cout << "超时,线程还没有执行完毕" << endl;
}
else if (status == std::future_status::ready) //表示线程成功返回
{
//表示成功返回
cout << "线程执行完毕 返回" << endl;
cout << result.get() << endl;
}
else if (status == std::future_status::deferred)//线程延迟执行,此条件成立
{
cout << "线程被延迟执行" << endl;
cout << result.get() << endl; //线程没有被创建,在主线程中执行
}
return 0;
二、std::shared_future
- 是个类模板,get()函数复制数据
三、std::atomic 原子操作
- 基本用法
std::atomic<int> g_num = 0; //封装了一个类型为int的对象,可以像操作一个int类型的变量来操作
- 不需要用到互斥量加锁(无锁)技术的多线程并发编程方式,在多线程中不会被打断的程序执行片段
- 原子操作,比互斥量效率更高,
- 互斥量的操作一般是针对一个代码段(几行代码),而原子操作一般针对的是一个变量,而不是一段代码
- std::atomic是给类模板,用来封装某个类型的值
- 问题引出:有两个线程,对一个变量进行操作,一个线程读值,另一个线程写值
int g_num = 0;
void mythread()
{
for (int i = 0; i < 10000000; i++)
{
g_num++;
}
}
int main()
{
thread obj(mythread);
thread obj1(mythread);
obj.join();
obj1.join();
cout << "另个线程执行完毕" << " = " << g_num << endl;
return 0;
}
输出结果:每次执行结果输出不一样(输出的是中间值),可能不是20000000 可以通过加锁的方式解决,能正确输出
- 完整代码演示:
std::atomic<int> g_num = 0; //封装了一个类型为int的对象,可以像操作一个int类型的变量来操作
void mythread()
{
for (int i = 0; i < 10000000; i++)
{
g_num++;
//g_num = g_num + 1 不支持
}
}
int main()
{
thread obj(mythread);
thread obj1(mythread);
obj.join();
obj1.join();
cout << "另个线程执行完毕" << " = " << g_num << endl;
return 0;
}
- std::atomic 操作bool类型代码演示
std::atomic<bool> g_b = false;
void mythread()
{
std::chrono::milliseconds ch(1000);
while (g_b == false)
{
//线程没要求退出
cout << "thread id = " << this_thread::get_id() << "运行中。。。。"<< endl;
this_thread::sleep_for(ch);
}
cout << "thread id = " << this_thread::get_id() << "运行结束" << endl;
}
int main()
{
thread obj(mythread);
thread obj1(mythread);
std::chrono::milliseconds ch(1000);
this_thread::sleep_for(ch);
g_b = true; //让线程运行结束
obj.join();
obj1.join();
cout << "程序运行完毕,退出" << endl;
return 0;
}
- 一般std::atomic原子,针对 ++,–,+=,&=,|=是支持的,其他的可能不支持