内容简介:C++11 多线程基本用法
在c++11中,c++标准库中就增加了关于多线程的一些操作,在此之前我们不得不调用系统底层的多线程函数,或者用第三方的线程库,多少还是有些不便,现在我们可以用标准库中的多线程函数来开发多线程程序了。下面就介绍一下基本的用法。
不管从创建线程还是向线程传递参数都方便了很多。
下面我们看一下锁的使用。
std::lock_guard是c++标准哭中的一个比较轻量级的一个锁,当我们生命一个std::lock_guard一个变量时会锁住互斥量,互斥量的释放实在它的析构函数中做的,因此当她出了它的作用域调用析构函数时会自动解锁,我们也不用担心因为程序因为异常或者其他的因素导致没有释放互斥量而造成死锁的情况了。注意上面的例子中所得范围仅限于while循环内,每次出whiile循环都会释放锁,如果把锁写在外面结果会大有不同。
下面看一个线程间通信的例子:
这里是一个类似于生产者消费着的例子,当我们在queue中存入6个元素的时候给通知另外一个线程去读取元素,这里用到了另外一种锁,这种锁和上面的锁相比用法比较灵活,我们可以手动解锁,控制锁的粒度.这里我们还用到了wait函数,我们来分析一下程序的运行过程,当我们启动两个线程,当然究竟哪个先启我们不能保证,当pop线程执行到wait时,会检查lambda表达式条件是否满足,如果条件不满足,将解锁互斥量,阻塞当前线程,当push线程通过notify_one函数通知,当pop线程收到通知时,线程从阻塞中苏醒,重新获取互斥量,也就是加锁,(通常我们等待的条件和通知线程的通知条件时一样的,如果不一样也没有什么意义,如果不一样我们通知时可能因为等待的条件已经满足,等待的线程收不到通知了),并且再次判断条件是否满足,如果满足wait返回继续持有该锁,往下走,当走到29行时,解锁互斥量,要注意,如果wait条件不满足时会解锁,否则该线程阻塞在这里并且不把锁释放掉,其他线得不到互斥量也会阻塞,因此我们这里用的是unique_lock,因为lock_guard没有提供手动解锁的方法,否则该线程因条件不满足而阻塞的时候将继续持有该锁,从而阻塞其他线程,这是我们最不想看到的。
以上之时一些简单的用法,更多详细的资料看链接里的c++11并发编程指南:点击打开链接,还有一本书,点击打开链接
以上所述就是小编给大家介绍的《C++11 多线程基本用法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Charlotte's Web
E. B. White / Puffin Classics / 2010-6-3 / GBP 6.99
This is the story of a little girl named Fern who loved a little pig named Wilbur and of Wilbur's dear friend, Charlotte A. Cavatica, a beautiful large grey spider. With the unlikely help of Templeton......一起来看看 《Charlotte's Web》 这本书的介绍吧!
Markdown 在线编辑器
Markdown 在线编辑器
HEX HSV 转换工具
HEX HSV 互换工具