目录
一、线程间通信的主要方式
(1).共享内存,即进程内线程间传递指针或引用进行信息传递,非线程安全,需要加锁;
(2).使用消息队列,非线程安全,配合互斥锁和条件变量;
(3).使用promise和future.
(4).使用packaged_task:将函数的执行和结果的获取分离。
(5).使用async异步函数处理方式
注意(4)和(5)是对同一个函数的执行和结果获取的分离。(1)、(2)和(3)不同线程即不同函数之间的消息传递。
二、多个线程处理同一个文件或数据
(1).可以自行拆分多个线程,并对要处理的数据进行分段,每个线程处理不同的数据段,即可完成;
(2).c++17中的for_each的使用
三、互斥锁和自旋锁的区别
互斥锁:锁在锁定的情况下,别的线程要等待锁被释放才能继续执行,此时会进入阻塞态,释放CPU资源。
自旋锁:锁在锁定的情况下,别的线程要等待锁被释放才能继续执行,此时会一直死等执行while(1),浪费CPU资源,一般用在多核通信上。
四、互斥锁和条件变量
既然互斥锁已经会存在阻塞情况了,那为什么还要用条件变量呢?
互斥锁主要是用在资源互斥上,而条件变量是在条件满足后,一个线程通知另外一个线程。如果条件变量的“条件”是资源不被使用,那么在使用互斥锁后,不需再使用条件变量。而其他情况,需要满足的“条件”满足后,需要执行notify告知阻塞等待的线程继续执行。
五、常用的锁
互斥锁,读写锁,自旋锁,信号量,条件变量