自炫锁2-b

1.

自旋锁
自旋锁也是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。
无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。
但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者进入睡眠状态。但是自旋锁不会引起申请者睡眠,如果自旋锁已经被占用,调用者就一直循环在那里判断占用者是否已经释放了锁,“自旋”一词就是因此而得名(空转锁)。
自旋锁主要用于Linux内核同步。
 

相关函数

1)初始化锁。
int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
2)阻塞加锁,若互斥锁已经被其它线程上锁,则调用者一直阻塞等待,直到被解锁后才上锁。

int pthread_spin_lock(pthread_spinlock_t *lock);
3)非阻塞加锁,若互斥锁未加锁,则上锁,若互斥锁已加锁,则函数立即返回失败.

int pthread_spin_trylock(pthread_spinlock_t*lock);
4)解锁。
int pthread_spin_unlock(pthread_spinlock_t*lock);

5)销毁锁,释放资源。
int pthread _spin_destroy(pthread_spinlock_t *lock);

自旋锁也存在优先唤醒的问题。

//b  自选
#include <unistd.h>
#include <pthread.h>
#include <string.h>
char buffer[101];        //全局共享的buffer.
pthread_spinlock_t spin; //声明自旋锁
void *pthfun(void *arg)
{for (int ii = 0; ii < 3; ii++){printf("%d:%ld:lock...\n",time(0),(long)arg);pthread_spin_lock(&spin);printf("%d:%ld:lock ok. \n",time(0),(long)arg);//操作共享的全局变量。sprintf(buffer,"%d:%ld,%d",time(0),pthread_self(),ii);sleep(5);pthread_spin_unlock(&spin);printf("%d:%ld:unlock... \n",time(0),(long)arg);usleep(100);}
}
int main()
{pthread_spin_init(&spin,PTHREAD_PROCESS_PRIVATE); //初始化锁。pthread_t pthid1,pthid2;pthread_create(&pthid1,NULL,pthfun,(void *)1);pthread_create(&pthid2,NULL,pthfun,(void *)2);pthread_join(pthid1,NULL);pthread_join(pthid2,NULL);pthread_spin_destroy(&spin); //销毁锁。return 0;
}

这段代码使用自旋锁保护了全局共享的缓冲区 `buffer`,并在两个线程中进行了并发访问。

每个线程的执行流程如下:

1. 线程获取自旋锁,进入临界区。
2. 线程操作全局共享的缓冲区 `buffer`。
3. 线程释放自旋锁,退出临界区。

这个程序使用 `pthread_spin_lock()` 和 `pthread_spin_unlock()` 函数来获取和释放自旋锁。在两个线程中并行执行时,它们会交替获取和释放自旋锁来保护全局共享的缓冲区。注意到 `buffer` 数组是全局共享的,如果不使用自旋锁来进行保护,会产生竞争条件导致多个线程同时访问和修改该缓冲区,导致不可预知的结果。

当线程运行时, `sprintf()` 函数会把当前时间戳、线程 ID 和循环计数器的值格式化到 `buffer` 缓冲区,在紧接着的 5 秒钟内通过 `sleep()` 函数模拟线程执行其他的任务。由于 `buffer` 缓冲区是全局共享的,它的内容可能会被其他线程读取和修改,因此需要使用自旋锁进行保护。

值得注意的是,这个程序在销毁自旋锁之前调用了 `pthread_join()` 函数来等待两个线程的执行完成,这是因为如果在等待线程执行完成之前销毁锁,会导致未定义的行为。

需要指出的是,自旋锁通常是在共享资源访问竞争不激烈的情况下使用,而且实现的正确性也需要根据实际情况进行评估和测试。

结果:

1702177416:2:lock...
1702177416:2:lock ok. 
1702177416:1:lock...
1702177421:1:lock ok. 
1702177421:2:unlock... 
1702177421:2:lock...
1702177426:1:unlock... 
1702177426:2:lock ok. 
1702177426:1:lock...
1702177431:2:unlock... 
1702177431:1:lock ok. 
1702177431:2:lock...
1702177436:1:unlock... 
1702177436:2:lock ok. 
1702177436:1:lock...
1702177441:2:unlock... 
1702177441:1:lock ok. 
1702177446:1:unlock... 

理解 : 就是

两边交替 打印

一个 如果对方 已经拿到锁, 就等待 

等对方 释放 ,  我们 这边  就 可以拿到锁 了;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程(IPC)_D3(2023-12-12)

XMind&#xff08;分图版&#xff09;

三层交换原理

三层交换机出现的背景 早期的网络中一般使用二层交换机来搭建局域网&#xff0c;而不同局域网之间的网络互通由路由器来完成。那时的网络流量&#xff0c;局域网内部的流量占了绝大部分&#xff0c;而网络间的通信访问量比较少&#xff0c;使用少量路由器已经足够应付了。 但…

js 根据指定日期格式化输出( 刚刚,几分钟前,几小时前,今天,标准日期)

代码如下&#xff1a; function getDateStr(stringTime) {let str stringTime;//将字符串转换成时间格式let timePublish new Date(str);let timeNow new Date();let minute 1000 * 60;let hour minute * 60;let day hour * 24;let month day * 30;let year month * 1…

智能优化算法应用:基于闪电搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于闪电搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于闪电搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.闪电搜索算法4.实验参数设定5.算法结果6.…

QML WebEngineView 全屏和退出

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在使用浏览器时,我们经常会用到全屏模式,最常见的场景有:观看视频、阅读文章、在线演示等。全屏模式的优点在于,它可以让用户充分地利用有限的屏幕空间,更好地专注于内容本身,从而提供丰富的沉浸式视觉…

渲染农场对工业产品渲染带来的意义与优势?

随着科技的进步&#xff0c;利用精细渲染图来呈现和推广工业设计的创新已成为行业标准。这些图像在产品研发、设计评审和营销阶段起着关键作用&#xff0c;同时对产品最终的成功也产生深远影响。然而&#xff0c;由于产品设计日渐复杂&#xff0c;制作渲染图的任务变得极具挑战…

Qt开发 之 Qt5各版本情况分析

文章目录 1、简介2、Qt5 版本归纳3、下载地址3.1、典型版本3.1.1、Qt5.0.03.1.2、Qt5.9.93.1.3、Qt5.12.12 3.2、当前Qt5最新版本 1、简介 Qt6 出生刚刚好一年的时间&#xff0c;已经出到6.6版本&#xff0c;带来了许多的新特性和改进。今天刚刚好抽空总结下陪伴 我工作这么长…

单元测试技术

文章目录 一、单元测试快速入门二、单元测试断言三、Junit框架的常用注解 一、单元测试快速入门 所谓单元测试&#xff0c;就是针对最小的功能单元&#xff0c;编写测试代码对其进行正确性测试。 常规的例如如果在main中测试&#xff0c;比如说我们写了一个学生管理系统&…

【C语言】数据结构——小堆实例探究

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 导读&#xff1a; 我们在前面学习了单链表和顺序表&#xff0c;以及栈和队列。 今天我们来学习小堆。 关注博主或是订阅专栏&a…

ubuntu如何远程ssh登录Windows环境并执行测试命令

ubuntu如何远程ssh登录Windows环境并执行测试命令 1 paramiko模块简介1.1 安装paramiko1.2 paramiko基本用法1.2.1 创建SSHClient实例1.2.2 设置主机密钥策略1.2.3 连接SSH服务器1.2.4 执行命令1.2.5 关闭SSH连接1.2.6 异常处理 2 windows的配置2.1 启动OpenSSH服务2.2 配置防火…

使用kubeadm部署一套Kubernetes v1.23.0集群

使用kubeadm部署一套Kubernetes v1.23.0集群 1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; • kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部…

PHP操作ZIP之ZipArchive类以及如何避免生成压缩文件带有目录层级的问题

常用的方法 php ZipArchive可以说是php自带的一个函数了&#xff0c;他可对对文件进行压缩与解压缩处理&#xff0c;但是使用此类之前我们必须在php.ini中把extensionphp_zip.dll前面的分号有没有去掉&#xff0c;然后再重启Apache这样才能使用这个类库。 ziparchive 可选参数…

Keil 编译输出信息分析:Program size: Code, RO-data , RW-data, ZI-data

一般 MCU 包含的存储空间有&#xff1a;片内 Flash 与片内 RAM&#xff0c;RAM 相当于内存&#xff0c;Flash 相当于硬盘。编译器会将一个程序分类为好几个部分&#xff0c;分别存储在 MCU 不同的存储区。 如图所示&#xff0c;在Keil中编译工程成功后&#xff0c;在下面的Bul…

k8s详细教程(二)

—————————————————————————————————————————————— 博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码…

05-详解Nacos配置管理中心,配置拉取的方式,热更新,配置共享(优先级)的步骤

Nacos配置管理 新建配置文件 当微服务部署的实例越来越多时,如果需要修改微服务的配置就需要逐个修改配置文件并且还要重启关联的微服务十分繁琐还易出错 项目中的配置文件分为每个项目特有的配置,项目所公用的配置 每个项目特有的配置: 有些项目中需要但有些项目中又不需要…

源码角度简单介绍LinkedList

LinkedList是一种常见的数据结构&#xff0c;但是大多数开发者并不了解其底层实现原理&#xff0c;以至于存在很多误解&#xff0c;在这篇文章中&#xff0c;将带大家一块深入剖析LinkedList的源码&#xff0c;并为你揭露它们背后的真相。首先想几个问题&#xff0c;例如&#…

C++初阶-string类的模拟实现

string类的模拟实现 一、经典的string类问题1.1 构造函数1.1.1 全缺省的构造函数 2.1 拷贝构造3.1 赋值4.1 析构函数5.1 c_str6.1 operator[]7.1 size8.1 capacity9.1 比较&#xff08;ASCII&#xff09;大小10.1 resize11.1 reserve12.1 push_back(尾插字符)13.1 append(尾插字…

MIT18.06线性代数 笔记3

文章目录 对称矩阵及正定性复数矩阵和快速傅里叶变换正定矩阵和最小值相似矩阵和若尔当形奇异值分解线性变换及对应矩阵基变换和图像压缩单元检测3复习左右逆和伪逆期末复习 对称矩阵及正定性 特征值是实数特征向量垂直>标准正交 谱定理&#xff0c;主轴定理 为什么对称矩…

PaddleOCR:超越人眼识别率的AI文字识别神器

在当今人工智能技术已经渗透到各个领域。其中&#xff0c;OCR&#xff08;Optical Character Recognition&#xff09;技术将图像中的文字转化为可编辑的文本&#xff0c;为众多行业带来了极大的便利。PaddleOCR是一款由百度研发的OCR开源工具&#xff0c;具有极高的准确率和易…

Python从入门到精通七:Python函数进阶

函数多返回值 学习目标&#xff1a; 知道函数如何返回多个返回值 问: 如果一个函数如些两个return (如下所示)&#xff0c;程序如何执行&#xff1f; 答&#xff1a;只执行了第一个return&#xff0c;原因是因为return可以退出当前函数&#xff0c;导致return下方的代码不执…