没有名字的记录
Posted randyniu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有名字的记录相关的知识,希望对你有一定的参考价值。
多线程服务器
当前的机器的红利已经结束了 主频已经达到了一个极限了
多线程有自身的优势
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>头文件中。
以上是关于没有名字的记录的主要内容,如果未能解决你的问题,请参考以下文章