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

我找到了所有这些不同类型的同步,每个同步都有许多锁定,解锁,测试锁等功能.

gcc原子操作

futexes的

互斥

自旋锁

seqlocks

rculocks

条件

信号灯

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

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

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

自旋锁不会阻塞,从而避免上下文波动.然而,它们避免了上下文切换,代价是消耗CPU上的所有循环,直到释放锁定(旋转).出于显而易见的原因,它们应仅应用于多处理器系统.永远不要睡在螺旋锁中.

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

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

我的问题是这样的:

到目前为止我对我的假设是否正确?

有谁知道各种选项的cpu周期成本? 我正在为应用添加并行性,因此我们可以获得更好的响应时间,但每个盒子运行的应用实例更少.表演是最重要的考虑因素.我不想使用上下文切换,旋转或许多额外的CPU周期来读取和写入共享内存.我绝对关心消耗的cpu周期数.

哪个(如果有的话)锁可以防止调度程序中断线程或中断...或者我只是一个白痴,所有同步机制都会这样做.什么样的中断被阻止?我可以阻止锁定线程的CPU上的所有线程或线程吗? 这个问题源于我担心中断一个线程,该线程持有一个非常常用的函数.我希望调度程序可能会调度任何可能会遇到此函数的其他工作者,然后因为它被锁定而阻塞.在带有锁的线程被重新安排并完成之前,将浪费大量上下文切换.我可以重新编写这个函数以最小化锁定时间,但它通常被称为我想使用锁来防止中断...跨所有处理器.

我正在编写用户代码...所以我得到软件中断,而不是硬件中断......对吗?我应该远离任何带有"irq"字样的功能(旋转/ seq锁).

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

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

futexes的?有没有理由使用它们而不是互斥体?

当没有工作时,是否有比使用条件睡眠线程更好的方法?

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

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

谢谢!

linux 线程流水线,linux线程同步相关推荐

  1. Linux 线程的创建与同步

    Linux 线程的创建与同步 1.线程的定义 2.线程的创建和使用 3.理解线程的并发运行 3.线程同步 3.线程的实现 1.线程的定义 线程:进程内部的一条执行路径.是资源调度和执行的基本单位. 进 ...

  2. Linux C :线程操作和线程同步的多线程并发编程

    在这之前可以先看看这边文章了解线程概念,信号量,条件变量,死锁.管程等概念 https://blog.csdn.net/superSmart_Dong/article/details/11666837 ...

  3. Linux系统开发9 线程同步

    [本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统编程8 线程同步多线程共享资源,不加锁,同步互斥演示多线程共享资源,加锁,同 ...

  4. Linux 多线程(二)线程安全:线程安全、互斥与互斥锁、死锁、同步与条件变量

    线程安全 互斥 死锁 同步 线程安全 所谓线程安全,其实就是当多个线程对临界资源进行争抢访问的时,不会造成数据二义或者逻辑混乱的情况(通常情况下对全局变量和静态变量进行操作时在会出现) 常见的线程安全 ...

  5. linux c 线程的创建、线程等待、线程终止、线程分离

    1. 什么是线程   线程是进程执行内部的一个执行分支,在一个进程内部运行的多种执行流:内部本质上是多个线程在同一个地址空间运行:第一个pcb称之为主线程:有多个线程就有多个执行流:一个进程至少有一个 ...

  6. linux 线程--内核线程、用户线程实现方法

    Linux上进程分3种,内核线程(或者叫核心进程).用户进程.用户线程 内核线程拥有 进程描述符.PID.进程正文段.核心堆栈 当和用户进程拥有相同的static_prio 时,内核线程有机会得到更多 ...

  7. 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

    文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...

  8. Linux多线程实践(1) --线程理论

    线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 一切进程至少有一个执行线程; 进程  VS. 线程  ...

  9. Linux 系统应用编程——线程基础

    传送门:Linux多线程编程实例解析 . linux多线程编程--同步与互斥 . 传统多任务操作系统中一个可以独立调度的任务(或称之为顺序执行流)是一个进程.每个程序加载到内存后只可以唯一地对应创建一 ...

最新文章

  1. pycharm test 右键run
  2. stdthread(7)并发unique_lock
  3. head first java ( 16章 )
  4. 简单的FTP应用程序
  5. 计算机仿真随机数生成,伪随机数生成器研究
  6. 华为交换机关闭接口命令_华为交换机常用命令及技巧
  7. 【Java】图解 Java 中的数据结构及原理
  8. Python 了解 bytes 与 str 的区别
  9. uva-993-贪心
  10. 计算机多媒体最新参考文献,计算机多媒体论文
  11. ACR122U读写器真假判断
  12. 【序列推荐】KDD2018|STAMP---基于注意力的短期记忆优先的推荐
  13. 计算机桌面ie图标无法删除,Win10系统中桌面ie图标无法删除如何解决
  14. ACdream 1069 无耻的出题人 无聊写着玩的题
  15. Wifi测速上下行不一致
  16. 技术人的软实力(0)不可忽视的软实力培养
  17. CIAA 网络安全模型 — 数据传输安全
  18. Qt:解决跨线程调用socket/IO类,导致报错的问题(socket notifiers cannot be enabled from another thread)
  19. Java入门学习(九)
  20. svn使用openldap验证apache访问方式

热门文章

  1. SNORT入侵检测系统
  2. 怎样才能“负载”均衡
  3. 《AutoCAD全套园林图纸绘制自学手册》一第1章 园林设计基本概念1.1 概述
  4. mybatis高级(3)_延迟加载_深度延迟_一级缓存_二级缓存
  5. 创建安全 Windows CE 设备(转)
  6. 【学习笔记】32、字符串格式化
  7. 【ABAP】 屏幕图片显示Demo
  8. 【公司金融课堂学习笔记】1、企业融资—风险投资
  9. 【转】根据起止日期+时间取数
  10. 【转】ABAP的坑4