十六.Linux——多线程(2)

这是一个典型的多线程,正常应该是从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操作堵塞,整个进程堵塞。

对应的代码如下:


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

相关推荐
海森大数据1 小时前
AI + 自动化重塑催化研发!北化黑灯实验室入选 AI for Science 典型案例
运维·人工智能·自动化
jeo陽1 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
暖核1 小时前
kubeadm 集群运维:Worker 节点下线删除、整套集群销毁重建指南
运维·开发语言·php
荒--2 小时前
Ubuntu软件包查询,弹框下载文件
运维·服务器·ubuntu
tachibana22 小时前
Go 语言里的 Context 是什么?
开发语言·后端·golang·go·语言
天桥下的卖艺者2 小时前
R语言使用ggcube包轻松绘制文章中的各类3D图形
开发语言·3d·r语言
‎ദ്ദിᵔ.˛.ᵔ₎2 小时前
Linux:对有关 SIGCHLD 的深层理解
linux·运维·服务器
aichitang20243 小时前
QCU 2.0.0:补齐 Windows、Linux 与 GNOME Wayland
linux·运维·windows·ai·agent·ai编程