bestboyxie 励志做一名能帮助到他人的程序员,如果你觉得这篇文章对你有帮助,麻烦你
点赞
其实学习多线程编程已经是很多年前的事情了真正用到多线程的应用场景并不多,总体上说来我觉得多线程有一下几个方面的思考
1。为什么要用多线程。
其实很多时候,学习多线程编程的时候,总是写了些莫名其妙然并卵的代码,并不能真正的表达多线程的意思。
例如网络编程,其实如果真的没有达到一定数量级完全可以用epoll一类的多路IO复用来解决问题。神马一个线程处理一个连接,本身就是浪费资源。
使用多线程,就是来完成单线程无法完成的事儿~。总结起来有一下几个方面的内容:
1。处理中有等待I/O的慢操作或者阻塞的操作。例如要读、写磁盘文件~~
2。在多核操作下,充分的利用CPU的性能。
3。把一个功能模块单独出来作为一个线程存在
除此之外,我暂时没有想到太多的应用场景。总结起来:为了性能,为了功能隔离
其实学习多线程的操作中几个必须要关注的点儿
1。线程创建销毁API
2。线程间的通讯机制
3。线程的同步机制
其实创建消除线程,主要就是两个API而已
至于线程间的通讯机制,虽然说很多,大致也不过两种一种基于socket类的文件套接字,另外一种则是基于内存的共享;线程内存天然就是共享的
线程同步机制。往往需要用到信号量与锁;
其实多线程中最难得往往是线程间的共享资源的访问问题;大家都要操作同样的一块内存,可能存在同时操作的情况,所以与单线程操作中有更大的不同、
1.如果不是竞争很严重的资源,简单的处理方式就是使用锁来保证互斥的操作;
2.如果是竞争严重的资源,就想办法设计无锁的机制,例如单生产但消费者模型,无锁的FIFO
3.用原子变量来实现无锁访问一些变量
其实难度上来说
锁《原子变量《无锁机制
性能上来说恰好相反
其实总体上来说,如果不是核心功能模块,能不用多线程就尽量不要用,程序单线程简单考虑的事儿少不容易出错。如果非要用多线程,尽量用socket一类的通知机制来实现通信,如果非要用共享内存,建议先好好学习一下锁 :读写锁,互斥锁,以及spinlock。如果是多核编程必须了解一下内存屏障;
然后学习一下原子变量,然后掌握一下无锁队列和无锁缓冲区