码迷,mamicode.com
首页 > 其他好文 > 详细

没有名字的记录

时间:2018-07-10 23:35:17      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:支持   析构函数   thread   最好   传输   操作系统   完整   自己   并行计算   

多线程服务器

当前的机器的红利已经结束了 主频已经达到了一个极限了

多线程有自身的优势

API日益成熟,操作系统和标准库都支持了多线程。

用多线程编程要在数据IO和计算找到平衡点。

一个是带宽,一个是数据计算。

linux下fork ,window下的Creat_Process。

多线程编程,如果显示的看到了multithread 就相当于是现代的goto。

可能带来的问题是

死锁

乱序

并发访问数据造成的问题

低效率

C++11中的接口

高级接口

async future

低阶接口

thread mutex  和操作系统相关了。

标准库提供的

std::thread_hardware_concurrency()函数可以查看有多少个并发的线程.

多线程编程中的问题?

当多线程中有共享变量的时候应该对共享变量进行一次保护,这样才可以。

只要不进行数据共享就可以了,这样就可以在计算的时候进行并行计算,不用担心会出现问题。

如果没有必要 线程之间不要共享资源。

在构造thread的时候都做了写哪些事情。thread的构造函数参数是没有限制的。

数据传输的时候用const的方式进行数据的传输

线程之间保证数据的完整性

一步到位的方法,就是原子操作。 <atomic> 一旦包裹起来就是不可分割的了。

mutex 临界区 比atomic更不容易出错。

STL中提供了lock_guard提供了构建的时候加锁,析构的时候自动解锁的功能,

标准库如何实现的?

std::lock()将所有的锁全部锁住,只有全部锁住才可以往下走, 否则回等待,会按照特定的顺序来进行锁住。仅仅管锁,解锁不管

std::lock_guard<std::mutex> lockA(a.Mutex, std::adopt_lock)  默认的lock_guard 会在调用的时候,调用a.mutex函数,因为上面已经调用了,因此这里就没有必须调用了,这里会传入第二个参数,只需要在析构的时候进行释放锁就可以了。

thread的两种死法。

一般在线程返回之前调用join函数,默认在析构的函数会自动释放,那么就不用调用join函数,

但是实际上的时候,thread的析构函数做了一些很奇怪的事情,在程序结束的时候不调用jion会出现什么事情呢?程序会挂掉,析构函数调用的是直接终止,调用abort函数。为什么这样设计呢?

thread的行为有两种,一种是由父线程来管理,一种是不管理,在运行完毕的时候自己死掉。

对于这两种行为,类的析构和构造没有办法进行模拟,因此,就需要程序员指定是那种行为,到底是不管还是自己进行处理。自己生成的线程自己进行管理,管理方式就是join ,最好先判断一下,joinable。另外一种是调用detach,就是自己结束声明周期的。如果detach之后在进行join就是错误的了,会抛出一个异常。

thread之间的交互

事先开好线程,只有在满足条件的情况下才会去做一些事情。

thread_yield 会将CPU释放出来,会让给其他的线程去跑。

正确的做法。

多线程为什么会快一点,快在什么地方?快是快在了执行的非顺序性。

C++中的条件变量,和mutex一起使用,本身是一种通知的方法,

<condition_variable>头文件中。

 

没有名字的记录

标签:支持   析构函数   thread   最好   传输   操作系统   完整   自己   并行计算   

原文地址:https://www.cnblogs.com/randyniu/p/9291951.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!