本课程,讲解的重点定位在c++11新标准中的多线程开发部分,同时,老师还会结合自己的经验把多线程的讲解进一步拓展到一个比较大的范畴,因为无论是c++11多线程开发还是各种其他的多线程开发实现方法,都有很多类似的地方或者说是相通的理论、技巧和要遵循的规则;同学们再学完以后,将对多线程程序开发有一个全面任何和深刻理解,从此再也不用担心自己写不好多线程程序了。
你将收获
适用人群
课程介绍
课程目录
大家都在学
正在加载中...
同学笔记
2020-03-05 10:48:03
来源:async、future、packaged_task、promise 查看详情
1. std::async、std::futrue创建后台任务并返回值
希望线程返回一个结果
std::async是一个函数模版,用来启动一个异步任务,启动一个异步任务后,他返回一个std::future对象,std::futrue是一个类模版。
什么叫“启动一个异步任务”,就是自动创建一个线程并开始执行线程入口函数,它返回一个std::futrue对象
这个std::futrue对象里含有入口函数所返回的结果,我们可以通过调用futrue对象的成员函数get()来获取结果。
这个结果没法马上拿到,在将来的某个时刻可以拿到。
程序会卡在get,直到子线程执行结束并返回值,所以一定要有返回值。
2. std::packaged_task
打包任务,把任务包装起来
是一个类模版,它的模版参数是各种可调用对象;通过std::packaged_task把各种可调用对象包装起来,方便将来作为线程入口函数
3. std::promise
类模版,可以在某个线程中给它复制,然后我们可以在其他线程中,把这个值取出来。
void mythread(std::promise<int> &tmpp, int calc)
{
calc++;
calc*=10;
std::chrono::milliseconds dura(5000);
int result = calc;
tmpp.set_value(result);
return;
}
std::promise<int> myprom;
std::thread tl(mythread, std::ref(prom),180);
std::futrue<int> ful = myprom.get_future();
cout<<ful.get<<endl;
4. 小结
2020-03-05 09:35:05
来源:condition_variable、wait、notify_one、notify_all 查看详情
1. 条件变量std::condition_variable\wait()\notify_one()
std::condition_variable my_cond;
my_cond.wait(subguard1,[this]{
if(!msgRecvQue.empty()){
return true;
}
return false;
})
//wait()用来等一个东西
//如果第二个参数lambda表达式返回值是true,那wait()直接返回;
//如果第二个参数lambda表达式返回值是false,那wait()互斥量将解锁,并堵塞到本行。直到其他线程调用notify_once成员函数为止。
//如果没有第二个lambda函数,就和返回false一样。
//当其他线程使用notify_once
//b.1 mycond尝试获得锁,获得之后执行后续代码
//b.2如果没获得锁,就继续休眠
//b.3如果没有第二个参数,则和返回true一样。
注意:notify_one不是每次都能唤醒wait,只有在wait堵塞时才能成功唤醒。
std::unique_lock<mutex> subguard1(mymutex);
2.上述代码思考
消息会不会执行的不及时
消息在执行时notify_one无效,因为没有卡在wait();
3.notify_all()
notify_one只能通知一个线程。
notify_all通知多个线程。
2020-03-04 23:21:03
来源:单例设计模式共享数据分析、解决,call_once 查看详情
1.设计模式
老外 先有项目,后有设计模式
中国 硬套设计模式
2. 单例模式
3. 单例模式在多线程中的使用
双重锁定(双重检查)
在GetInstance中两个if(m_instance==NULL);
//
if(m_instance==NULL){
std::unique_lock<mutex> mymutex(resource_mutex);
if(m_instance==NULL){
m_instance=new MyCAS();
static CFarhuishou cl; //类套类,为了delete m_instance.
}
}
4. std::call_once() //c++11引入的函数,该函数第二个参数是一个函数名a();
call_once功能是保证函数a()只执行一次。
static std::once_flag g_flag;
std::call_once(g_flag,CreateMyinstance);
总结:最好在主线程中先创建instance,避免单例共享代码的问题。
没有更多了