Linux线程同步

2024-01-10

我是 Linux 和 Linux 线程的新手。我花了一些时间谷歌搜索来尝试了解可用于线程同步的所有函数之间的差异。我还有一些问题。

我发现了所有这些不同类型的同步,每种都有许多用于锁定、解锁、测试锁定等的功能。

  • gcc原子操作
  • futexes
  • mutexes
  • 自旋锁
  • seqlocks
  • rculocks
  • 状况
  • 信号量

我目前(但可能有缺陷)的理解是这样的:

信号量是进程范围内的,涉及文件系统(实际上我假设),并且可能是最慢的。

Futexes 可能是互斥锁、自旋锁、seqlocks 和 rculocks 使用的基本锁定机制。 Futexes 可能比基于它们的锁定机制更快。

自旋锁不会阻塞,从而避免上下文切换。然而,它们避免了上下文切换,代价是消耗 CPU 上的所有周期,直到锁被释放(旋转)。出于显而易见的原因,它们只应该在多处理器系统上使用。永远不要睡在自旋锁中。

seq 锁只是告诉您何时完成工作,如果编写者更改了工作所基于的数据。在这种情况下,你必须返回并重复该工作。

原子操作是最快的同步调用,并且可能在所有上述锁定机制中使用。您不想对共享数据中的所有字段使用原子操作。当您访问多个数据字段时,您希望使用锁(mutex、futex、spin、seq、rcu)或对锁标志进行单个原子操作。

我的问题是这样的:

  1. 到目前为止我的假设正确吗?

  2. 有谁知道各种选项的CPU周期成本吗?我正在向应用程序添加并行性,以便我们可以获得更好的挂机时间响应,但代价是每个盒子运行更少的应用程序实例。表演是最重要的考虑因素。我不想通过上下文切换、旋转或大量额外的 cpu 周期来消耗 cpu 来读写共享内存。我绝对关心消耗的CPU 周期数。

  3. 哪些锁(如果有)可以防止调度程序或中断中断线程......或者我只是一个白痴,所有同步机制都会这样做。可以防止哪些类型的中断?我可以阻止所有线程或仅阻止锁定线程的 CPU 上的线程吗?这个问题源于我担心中断持有一个非常常用的函数的锁的线程。我预计调度程序可能会调度任意数量的其他工作人员,这些工作人员可能会遇到此函数,然后因为它被锁定而阻塞。在具有锁的线程被重新调度并完成之前,大量的上下文切换将被浪费。我可以重写这个函数以最小化锁定时间,但它仍然如此普遍地被称为我想使用一个锁来防止中断......跨所有处理器。

  4. 我正在编写用户代码......所以我得到软件中断,而不是硬件中断......对吗?我应该远离任何带有“irq”一词的函数(自旋/序列锁)。

  5. 哪些锁用于编写内核或驱动程序代码,哪些锁用于用户模式?

  6. 有人认为使用原子操作让多个线程在链表中移动是疯狂的吗?我正在考虑以原子方式将当前项目指针更改为列表中的下一个项目。如果尝试有效,则线程可以安全地使用当前项目在移动之前所指向的数据。其他线程现在将沿着列表移动。

  7. 未来?有什么理由使用它们而不是互斥体?

  8. 有没有比在没有工作时使用条件使线程休眠更好的方法?

  9. 当使用 gcc 原子操作(特别是 test_and_set)时,我可以通过先进行非原子测试然后使用 test_and_set 进行确认来提高性能吗?我知道这将视具体情况而定,所以情况如下。有大量的工作项目,比如说数千个。每个工作项都有一个初始化为 0 的标志。当线程具有对该工作项的独占访问权限时,该标志将为 1。将会有很多工作线程。每当线程寻找工作时,它们都可以非原子地测试 1。如果它们读取到 1,我们就可以确定该工作不可用。如果他们读取到零,则需要执行原子 test_and_set 来确认。因此,如果原子 test_and_set 是 500 个 cpu 周期,因为它禁用了流水线,导致 cpu 进行通信并且 L2 缓存刷新/填充....并且一个简单的测试是 1 个周期....那么只要我有更好的比率当遇到已经完成的工作项目时,比例为 500 比 1……这将是一场胜利。

我希望使用互斥锁或自旋锁来保护我只希望系统上的一个线程(而不是 CPU)一次访问的代码部分。我希望谨慎使用 gcc 原子操作来选择工作并尽量减少互斥锁和自旋锁的使用。例如:可以检查工作项中的标志以查看线程是否已对其进行工作(0 = 否,1 = 是或正在进行)。一个简单的 test_and_set 告诉线程是否有工作或需要继续。我希望在有工作的时候使用条件来唤醒线程。

Thanks!


应用程序代码可能应该使用 posix 线程函数。我假设你有手册页,所以输入

man pthread_mutex_init
man pthread_rwlock_init
man pthread_spin_init

阅读它们以及对它们进行操作的函数以找出您需要的内容。

如果您正在进行内核模式编程,那么情况就不同了。您需要了解您正在做什么、需要多长时间以及它被调用的上下文,以便了解您需要使用什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux线程同步 的相关文章

  • 为什么 gcc 链接时没有 lpthread 标志?

    我当时正在做一个业余爱好项目 其中互斥体的行为很神秘 我将其归结为这个显然应该陷入僵局的测试用例 include
  • 两将协议

    我正在尝试在不可靠的通道上制定一个协议 基本上两方 A 和 B 必须同意做某事 所以这就是两位将军的问题 http en wikipedia org wiki Two Generals 27 Problem 由于没有万无一失的解决方案 我正
  • ThreadPool.SetMinThreads 不创建任何新线程

    我想弄清楚到底有什么影响ThreadPool SetMinThreads makes 根据官方文档 https learn microsoft com en us dotnet api system threading threadpool
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • 使用 React.forwardRef 与自定义 ref prop 的价值

    我看到React forwardRef从反应文档来看 似乎是将引用传递给子功能组件的认可方式 const FancyButton React forwardRef props ref gt
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • Python if 与 try- except

    我想知道为什么下面程序中的 try except 比 if 慢 def tryway try while True alist pop except IndexError pass def ifway while True if alist
  • 为什么同样的算法在 Scala 中运行比在 C# 中慢得多?以及如何让它更快?

    该算法根据序列中每个成员的变体创建序列的所有可能变体 C 代码 static void Main string args var arg new List
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 是否有一种更简单的方法可以并行运行命令,同时在 Windows PowerShell 中保持高效?

    此自我回答旨在为那些受困于 Windows PowerShell 并由于公司政策等原因而无法安装模块的用户提供一种简单且高效的并行替代方案 在 Windows PowerShell 中 built in可用的替代方案local并行调用是St

随机推荐

  • 为什么我无法注销 django 用户身份验证?

    我正在使用 django contrib auth 用户管理系统 因此 我将注册 插入到用户表 模型中 并从 django contrib auth views login 进行登录 以便我可以登录 但是 我无法使用 django cont
  • 类方法上的 functools.partial

    我试图使用另一个更通用的类方法定义一些类方法 如下所示 class RGB object def init self red blue green super RGB self init self red red self blue blu
  • 我什么时候应该为 Map 键创建一个类?

    我正在使用 Java 6 假设我有一个类 我想将其实例保存到地图中 后来我想仅使用 关键字段 来检索实例 为了简洁起见 我将忽略字段修饰符 getter 和 setter class A String field1 String field
  • 如何在 Url.Content 中包含 MVC Razor 变量?

    使用 MVC 3 Razor 如何在调用中指定变量 Url Content Example var myVar Request QueryString foo a href Url Content a bar myvar gt click
  • 程序在其他 Windows 机器上无法正常运行

    我的应用程序遇到问题 我试图获取它运行的系统的所有网络配置 最终目标是找到优先级最高的MAC地址 当我使用 QtCreator 运行代码时 代码运行正常并且可以工作 当我创建包含 dll 文件和 exe 文件的文件夹时 代码也运行正常 但问
  • 无法使用 API Gateway 运行 AWS Lambda 函数

    我创建了一个简单的 python 3 7 lambda 函数 import json import boto3 s3 boto3 client s3 def lambda handler event context bucket nubi
  • 如何按 R 数据表中的特定列分组后选择行的子集[重复]

    这个问题在这里已经有答案了 我想在按 R 数据表中的特定列分组后根据条件选择行的子集 以Mtcars数据为例 dt mtcars lt as data table mtcars dt mtcars N by hp hp N 1 110 3
  • HTML Canvas 上的发光效果,可能使用卷积核/矩阵

    我正在将 PNG 图像绘制到 HTML 画布上 并且实现了一个过滤器系统 以允许在将图像数据传输到画布之前对图像数据执行卷积过滤器 有谁知道如何使用卷积核 矩阵创建发光效果 我不确定术语是什么 但我正在谈论这些 http www html5
  • IEnumerable 的扩展方法?

    我有很多不同的枚举 例如 public enum MyEnum Description Army of One one Description Dynamic Duo two Description Three Amigo s three
  • 使用 .htaccess 重定向移动设备 // 排除 IPAD

    我在 htaccess 中使用此代码来重定向移动设备 目前iPad也是一种移动设备 我该如何更改此设置 以便 ipad 不会重定向到移动版本 谢谢你 RewriteEngine on RewriteBase Check if this is
  • IDLE 和 Python 在 Mac OS X 中具有不同的路径

    我运行的是 Mac OS X 10 5 8 我已经从网站安装了 Python 2 6 它在我的应用程序目录中 我已经编辑了我的 bash profile 以具有 Setting PATH for MacPython 2 6 The orgi
  • 使用Volley进行Android开发时,setRetryPolicy()方法调用应该写在哪里

    这可能是一个简单的问题 但我在实际代码中测试了它 无法判断正确的行为setRetryPolicy 凌空的功能 请任何人告诉我该声明的正确位置 我应该写这个方法调用吗onErrorResponse 函数还是在将请求输入队列之前 这是我的位图图
  • Helper Devise:无法在请求环境中找到“Warden::Proxy”实例

    我尝试将 Devise 用于我的 Rails 应用程序 我可以注册并登录 但是当我转到其他页面 构建 时 出现以下错误 Devise Home 中的 MissingWarden show Devise 找不到Warden Proxy您的请求
  • 如何用 LESS 混合多种背景

    我有一个小问题 是否有任何选项可以将多个背景与 LESS 混合 我在 LESS 中有这样的背景设置 background centered url position horizontal center position vertical t
  • 如何在 ios 和 android 的 flutter 中检测模拟位置

    我在屏幕上使用位置包和谷歌地图 flutter 我想检测用户是否使用假 GPS 是否有一个包可以检测 android 和 ios 中可用的 flutter 中的模拟位置 我尝试过使用 TrustFall 包 但我的应用程序总是意外关闭 是否
  • 无法使用 ImagePicker Flutter 分配文件

    我正在学习 imagepickerhttps pub dev packages image picker https pub dev packages image picker 但我不明白为什么当我一步步使用该方法时会出现错误 这就是问题
  • 如何使 EditText 不可编辑/禁用

    我有一个 EditText 用户不应在其中提供输入 所以我尝试禁用它 edittext setEnabled false edittext setClickable false 但是 当我从其他 EditText 中按软键盘中的 下一步 按
  • Maven 从 url 下载或获取 wsdl 到项目目录

    我们使用 url 位置的 wsdls 开发了一个 Web 服务客户端应用程序 我不希望 Web 服务客户端每次都去验证实际的 wsdls 因此想将 wsdls 下载到本地项目中 有什么方法可以使用类似于复制资源的maven下载wsdls吗
  • 你能解释一下这个 sed 一行吗?

    下面一行逆向打印出文件的内容 sed n 1 G h p test txt sed 逐行读取文件怎么可能呢 你能解释一下它的含义吗 n flag 1 G h and p 在这个命令中 这将完成与以下相同的工作tac 即恢复行的顺序 将sed
  • Linux线程同步

    我是 Linux 和 Linux 线程的新手 我花了一些时间谷歌搜索来尝试了解可用于线程同步的所有函数之间的差异 我还有一些问题 我发现了所有这些不同类型的同步 每种都有许多用于锁定 解锁 测试锁定等的功能 gcc原子操作 futexes