多线程-读写锁的一些理解

devtools/2024/10/22 7:10:22/
  1. 分配在不同的核心上:如果主线程和子线程被操作系统的调度器分配到不同的处理器核心上,它们可以真正地同时运行。这是因为每个核心可以独立执行代码,所以两个线程可以并行执行,而不是交替执行。

  2. 分配在同一核心上:如果主线程和子线程被分配到同一个处理器核心上,它们将通过时间片轮转的方式交替运行。操作系统会为每个线程分配一个时间片,在时间片用尽后,当前线程会被挂起,操作系统会调度另一个线程来运行。这种方式被称为并发执行,因为它给用户的感觉是多个线程同时运行,但实际上它们是在快速交替执行。

在实际的操作系统中,线程调度是一个复杂的过程,涉及到多种因素,如线程的优先级、系统的负载、处理器的核心数量等。操作系统的调度器会根据这些因素来决定如何分配线程到处理器核心上,以及如何管理时间片。

此外,操作系统还可能使用一些优化技术,如线程亲和性(thread affinity),允许开发者或系统指定某些线程应该运行在特定的核心上。这可以用于提高性能,特别是在需要紧密协作的线程之间,或者在某些线程需要访问特定核心上的特定资源时。

1. **读写锁的工作原理**:读写锁(`pthread_rwlock_t`)允许多个读线程同时访问共享资源,但如果有写线程正在访问资源,其他线程(无论是读还是写)都必须等待。这意味着,即使多个读线程可以同时访问资源,一旦写线程请求写锁,所有读线程都必须等待写线程完成操作并释放写锁后,才能继续执行。

2. **写锁的互斥性**:确实,写锁是互斥的。当一个写线程获取写锁时,它会阻止其他所有线程(包括其他写线程和所有读线程)获取任何类型的锁。这是为了确保写操作的原子性和一致性。

3. **读锁的并发性**:在没有写锁被持有的情况下,多个读线程可以同时持有读锁。这意味着,如果所有8个线程都被分配到不同的处理器核心上,并且没有写线程持有写锁,那么5个读线程确实可以同时运行。然而,一旦一个写线程获取了写锁,所有其他线程(包括其他读线程)都必须等待。

4. **线程调度**:即使在多核处理器上,线程的并发执行也受到操作系统调度策略的影响。操作系统的调度器会根据当前的系统状态和调度策略来决定如何分配线程到处理器核心上,以及如何管理时间片。

5. **锁的释放**:在你的代码中,写线程在完成写操作后会释放写锁,这允许其他等待的线程(如果有的话)获取锁。同样,读线程在完成读操作后也会释放读锁。

6. **线程的无限循环**:你的代码中,线程函数包含一个无限循环(`while(1)`),这意味着线程会一直运行,直到被外部条件(如程序结束或线程被取消)终止。这可能会导致资源泄漏,因为线程会一直占用处理器资源。

7. **线程的终止**:在你的代码中,写线程在执行一次写操作后会退出(通过`pthread_exit(NULL)`),而读线程则会继续运行。这可能会导致读线程在写线程退出后继续运行,而写线程则不再更新共享资源。

总的来说,你的理解是正确的,读写锁确实允许多个读线程同时访问共享资源,但写线程会阻止所有其他线程访问资源。然而,实际的并发性和线程调度还受到操作系统调度策略的影响。
 


http://www.ppmy.cn/devtools/127765.html

相关文章

003_django基于Django高校岗位招聘平台与数据可视化分析设计和实现2024_414pr4jc

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

基于深度学习的进化神经网络设计

基于深度学习的进化神经网络设计(Evolutionary Neural Networks, ENNs)结合了进化算法(EA)和神经网络(NN)的优点,用于自动化神经网络架构的设计和优化。通过模拟自然进化的选择、变异、交叉等过…

​微信小程序 页面间传递数据

在小程序中,给页面传递参数通常有以下几种方法: 通过URL传递参数: 在小程序中,可以在页面的路径后面添加参数,然后在页面的 onLoad 函数中获取这些参数。 // 在app.json中配置页面路径 "pages": [{"pat…

Flutter升级到3.24.0后web项目空白显示

前言 我将Flutter版本从3.19.3升级到3.24.0后我启动了以前可以运行的Flutter Web程序,结果页面空白并在控制台出现如下错误 Warning: In index.html:38: Local variable for "serviceWorkerVersion" is deprecated. Use "{{flutter_service_worker…

Sigrity-Power SI如何使用Model Extraction模式提取电源网络的S参数和阻抗操作指导(一)

Sigrity-Power SI如何使用Model Extraction模式提取电源网络的S参数和阻抗操作指导(一) Sigrity PowerSI是频域电磁场仿真工具,以下图为例介绍如果用它观测电源的网络的S参数以及阻抗的频域曲线. 观测IC端电源网络的自阻抗 1. 用powerSi.exe打开该SPD文件 2. 选…

Docker可视化管理工具DockerUI的使用

DockerUI是一个易用且轻量化的 Docker 管理工具,透过 Web 界面的操作,更方便对于 Docker 指令不熟悉的用户更容易操作 Docker 。 DockerUI拥有易操作化化界面,不须记忆Docker指令,仅需下载镜像即可立刻加入完成部署。基于 Docker…

ab命令深入解析:ApacheBench性能测试工具

软考鸭微信小程序 学软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 引言 在Web开发和运维领域,性能测试是评估服务器和应用性能的重要手段。ApacheBench(简称ab)是Apache HTTP服务器自带的…

python项目实战——下载美女图片

python项目实战——下载美女图片 文章目录 python项目实战——下载美女图片完整代码思路整理实现过程使用xpath语法找图片的链接检查链接是否正确下载图片创建文件夹获取一组图片的链接获取页数 获取目录页的链接 完善代码注意事项 完整代码 import requests import re import…