十六.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操作堵塞,整个进程堵塞。

对应的代码如下:


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

相关推荐
Ruiery12 分钟前
Linux 6.6内核内存管理深度解析(十五):CMA 连续内存分配器
linux·运维·服务器
xiaoye-duck42 分钟前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
测试界的小码农1 小时前
【Linux 命令实战(01):认识 Linux 终端,从零掌握第一个命令】
linux·运维·服务器
布裘1 小时前
【银河麒麟】重启后时区丢失?排查发现 localtime 被业务程序替换成硬链接
linux·运维·网络
huainingning2 小时前
锐捷10.X路由器版本升级不生效问题排查
运维·网络·智能路由器
荣合技术服务3 小时前
HPC 超算集群故障维修实录:找荣合科算维护后,模拟仿真计算又能跑了
运维·服务器·超算服务器·荣合科算
nice_lcj5203 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河663 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
GeW4 小时前
高端化转型进入“补底层”阶段:Linux与数据库的再定位
linux
silent5 小时前
龙芯3B6000M运行Yolov8+FastApi
linux·loongarch·loongnix·龙芯