线程的通讯问题实际上可以等价为多个线程如何用好共享内存的问题,也就是说一个线程通过修改共享内存中的一个变量,另一个线程就可以通过某种规则得到这个变动,作出相对应的动作。
所以,多线程的通讯方式就可以看成是使用共享内存的方式。
而控制共享内容的有序利用,主要的技术手段就是锁。
锁相关的内容,可以参考前面的一篇文章:
std库锁机制的使用
在锁机制的基础上,用于多线程的通讯方式还有一些具体的使用方式。
多线程间简单的原子操作
在多线程的使用场景中,有一些比较简单的操作,比如多个线程对一个变量进行简单的操作,比如bool标志位置位,余额的加减乘除之类,这样就不需要用到上面的比较复杂的代码来进行多线程的同步和协调。
在C++的std库中,有一个原子操作类可以直接实现,atomic。
因为atomic在库的内部是保证了一次操作的原子性,所以这个操作不能太复杂,一般来说最好是对一些基本类型做一些基本操作。
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> counter(0);
void increment() {
for (int i = 0; i < 1000; ++i) {
cou