
这是一个典型的多线程,正常应该是从1依次打印到5000,但我们根据上文知道:
因为是多个处理器运行多个线程,自加操作不是原子操作,可能会打印相同的m_count;且如果同时进行两次自增操作,m_count只会增加1,发生一次计数丢失。
所以共打印5000行,但可能最后打印出m_count的值到不了5000;
那么我们如何解决这样的问题呢?
解决方法:
1.信号量
信号量是p,v操作(是原子操作,不会出现两个线程同时把信号量从 1减成0。)
代码:

p,v操作是原子操作,不会出现两个线程同时把信号量从 1减成0。所有只会有一个线程执行p,别的线程都会堵塞;执行v之后,才会有另一个线程执行p,别的都堵塞。
2.互斥锁 lock,unlock

本质上和信号量一样,线程在要执行语句前加锁,只有自己解锁后,别的线程才可执行。
有些函数在多线程并发运行不能用,比如,strtok()分割字符串,因为会共用了同一个静态变量,后使用的会覆盖先使用的内容。(可以使用线程安全的版本 strtok_r()解决)
这里,就要引出一个在多线程中的重要概念------生产者消费者问题(有限缓冲区的问题):
生产者:产生数据
消费者:消费数据

过程图:

必须先进行p操作,检查有没有空的空间供使用(信号量是否大于0),再进行加锁操作。避免加完锁,p操作堵塞,整个进程堵塞。
对应的代码如下:

这就是多线程的全部内容,感谢您的观看!