自炫锁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... 

理解 : 就是

两边交替 打印

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CGAL的3D网格生成

1、介绍 该软件包致力于生成离散三维域的各向同性简化网格。要网格化的域是三维空间的子集&#xff0c;需要有界。域可以连接或由多个组件组成和/或细分为几个子域。 边界曲面和细分曲面是平滑曲面或分段平滑曲面&#xff0c;由平面或曲面面片形成。表面可能表现出一维特征&…

TCP/IP详解——ARP 协议

文章目录 一、ARP 协议1. ARP 数据包格式2. ARP 工作过程3. ARP 缓存4. ARP 请求5. ARP 响应6. ARP 代理7. ARP 探测IP冲突8. ARP 协议抓包分析9. ARP 断网攻击10. 总结 一、ARP 协议 ARP&#xff08;Address Resolution Protocol&#xff09;协议工作在网络层和数据链路层之间…

浅谈 USB Bulk 深入浅出 (3) - USB Bulk 装置传输的注意事项

来源&#xff1a;大大通 作者&#xff1a;冷氣團 1 USB Bulk 是什么 USB 是即插即用使用差动信号的装置界面&#xff0c;是以 端点 ( Endpoint )&#xff0c;做为传输装置的输出入端&#xff0c;透过不同的端点 ( Endpoint ) 和模式&#xff0c;来进行与装置的沟通&#xff…

WWW 指南-万维网联盟(World Wide Web)

WWW - 万维网联盟 WWW通常称为网络。 web是一个世界各地的计算机网络。 电脑在Web上使用标准语言沟通。 万维网联盟&#xff08;W3C&#xff09;制定了Web标准 什么是WWW&#xff1f; WWW 代表 World Wide Web(万维网)万维网常常被称为 网络网络是世界各地的计算机网络网络中…

nestjs守卫/全局守卫校验jwt

一、守卫 目标 部分接口需要用户登录后才可以访问&#xff0c;用户登录后可以颁发 jwt_token 给前端&#xff0c;前端在调用需要鉴权的接口&#xff0c;需要在请求头添加 jwt_token&#xff0c;后端校验通过才能继续访问&#xff0c;否则返回403无权访问 创建守卫 anth 安装…

java.lang.NegativeArraySizeException

构建maven项目时发生的异常 maven-resources-production:gci-system-start:java.lang.NegativeArraySizeException:-1972174848解决方案 先将 target 目录删除,然后重新构建项目即可

【从零开始学习JVM | 第九篇】了解 常见垃圾回收器

前言&#xff1a; 垃圾回收器&#xff08;Garbage Collector&#xff09;是现代编程语言中的一项重要技术&#xff0c;它提供了自动内存管理的机制&#xff0c;极大地简化了开发人员对内存分配和释放的繁琐工作。通过垃圾回收器&#xff0c;我们能够更高效地利用计算机的内存资…

基于pandoraNext使用chatgpt4

1.登陆GitHub 获取pandoraNext项目GitHub - pandora-next/deploy: Pandora Cloud Pandora Server Shared Chat BackendAPI Proxy Chat2API Signup Free PandoraNext. New GPTs(Gizmo) UI, All in one! 在release中选择相应版本操作系统的安装包进行下载 2.获取license_…

【OS】操作系统总复习笔记

操作系统总复习 文章目录 操作系统总复习一、考试题型1. 论述分析题2. 计算题3. 应用题 二、操作系统引论&#xff08;第1章&#xff09;2.1 操作系统的发展过程2.2 操作系统定义2.3 操作系统的基本特性2.3.1 并发2.3.2 共享2.3.3 虚拟2.3.4 异步 2.4 OS的功能2.5 OS结构2.5 习…

聊聊Java中的常用类String

String、StringBuffer、StringBuilder 的区别 从可变性分析 String不可变。StringBuffer、StringBuilder都继承自AbstractStringBuilder &#xff0c;两者的底层的数组value并没有使用private和final修饰&#xff0c;所以是可变的。 AbstractStringBuilder 源码如下所示 ab…

鸿蒙ArkTS Web组件加载空白的问题原因及解决方案

问题症状 初学鸿蒙开发&#xff0c;按照官方文档Web组件文档《使用Web组件加载页面》示例中的代码照抄运行后显示空白&#xff0c;纠结之余多方搜索后扔无解决方法。 运行代码 import web_webview from ohos.web.webviewEntry Component struct Index {controller: web_webv…

MuMu模拟器12如何连接adb?

一、MuMu模拟器12端口查看 MuMu模拟器12现已支持adb同时连接多个模拟器进行调试的操作&#xff0c;可以参考以下步骤操作&#xff0c;查看MuMu模拟器12本体以及多开模拟器的adb端口&#xff1a; 单开的MUMU模拟器12可通过模拟器右上角菜单-问题诊断&#xff0c;获取ADB调试端…

VM-Linux 桥接网络设置

VM-Linux 桥接网络设置 文章目录 VM-Linux 桥接网络设置什么是桥接网络环境工具关键配置VM设置CentOS7配置 什么是桥接网络 网络桥接是将两个或多个独立的网络进行连接的一种方法。它可以把两个网络的数据传输机制集成在一起&#xff0c;使得用户可以更顺畅地访问各个网络&…

Linux实操——安装Mysql

安装Mysql 一、检查是否已经安装了mariadb数据库,并卸载二、下载mysql包&#xff0c;并通过ftp上传到服务器三、解压安装包四、创建数据存储文件夹五、创建执行mysqld命令的用户&#xff0c;并初始化mysql六、启用传输安全七、启动mysql&#xff0c;验证是否安装成功 总结 博主…

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器 本文为stm32GPIO的介绍与使用&#xff0c;例子是简单的LED点亮。 一、 GPIO GPIO&#xff08;General Purpose I/O Ports&#xff09;意思为通用输入/输出端口&#xff0c;通俗地说&#xff0c; 就是一些引脚&#xff0c;可…

数据结构第六课 -------迭代排序(快速排序和归并排序)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

linux 调试工具 GDB 使用

gdb是linux下常用的代码调试工具&#xff0c;本文记录常用命令。 被调试的应用需要使用 -g 参数进行编译&#xff0c;如不确定可使用如下命令查看是否支持debug readelf -S filename | grep "debug" 启动调试 gdb binFile 例如要调试sshd&#xff1a; 调试带参数…

【淘宝网消费类电子产品销售数据可视化】

淘宝网消费类电子产品销售数据可视化 引言数据爬取与处理数据可视化系统功能1. 总数据量分析2. 店铺总数据3. 店铺销售额排名4. 不同电子商品销售价格5. 单个商品价格排名6. 不同省份平均销量7. 不同地区的平均销售额8. 省份数量9. 每个省份有用的平均个数 创新点结语 引言 随…

平头哥玄铁 E902 编译与使用

玄铁 E902 是平头哥半导体有限公司自主研发的极低功耗、极低成本嵌入式 CPU 核&#xff0c;以 8 位 CPU 的成本获得 32 位嵌入式 CPU 的运行效率与性能。 E902 兼容 RISC-V 指令架构&#xff0c;采用 16/32 位混合编码系统&#xff0c;指令系统与流水线硬件结构精简高效&#x…

单片机的低功耗模式介绍

文章目录 简介一、功耗来源说明1.1、芯片工作模式1.2、静态损耗1.3、I/O额外损耗1.4、动态损耗 二、功耗如何测量三、降低功耗有什么方法3.1、选取合适的芯片工作模式3.2、降低工作频率3.3、关闭不需要使用的外设3.4、 降低静态电流损耗3.5、 周期采集供电3.6、 设置IO口状态 四…