linux线程同步
我是
linux和
linux线程的新手.我花了一些时间谷歌搜索试图理解可用于线程同步的所有函数之间的差异.我还有一些问题.
我找到了所有这些不同类型的同步,每个同步都有许多锁定,解锁,测试锁等功能. > gcc原子操作 我当前(但可能有缺陷)的理解是这样的: 信号量是进程范围的,涉及文件系统(实际上我假设),并且可能是最慢的. Futexes可能是互斥锁,自旋锁,seqlocks和rculocks使用的基本锁定机制. Futexes可能比基于它们的锁定机制更快. 自旋锁不会阻塞,从而避免上下文波动.然而,它们避免了上下文切换,代价是消耗CPU上的所有循环,直到释放锁定(旋转).出于显而易见的原因,它们应仅应用于多处理器系统.永远不要睡在螺旋锁中. 如果作者更改了工作所基于的数据,seq锁只会告诉您何时完成工作.在这种情况下,您必须返回并重复工作. 原子操作是最快的同步调用,并且可能在所有上述锁定机制中使用.您不希望对共享数据中的所有字段使用原子操作.当您访问多个数据字段时,您希望在锁定标志上使用锁(互斥锁,futex,旋转,seq,rcu)或单个原子操作. 我的问题是这样的: >到目前为止我对我的假设是否正确? 我希望使用互斥锁或自旋锁来保护代码段,我希望一次只能访问SYSTEM(而不是CPU)上的一个线程.我希望谨慎地使用gcc原子操作来选择工作并尽量减少互斥锁和自旋锁的使用.例如:可以检查工作项中的标志以查看线程是否已经工作(0 =否,1 =是或正在进行中).一个简单的test_and_set告诉线程它是否有效或需要继续.我希望在工作时使用条件唤醒线程. 谢谢! 解决方法
应用程序代码应该使用posix线程函数.我假设你有man page这样的类型
man pthread_mutex_init man pthread_rwlock_init man pthread_spin_init 阅读它们以及对它们起作用的功能,以找出您的需求. 如果您正在进行内核模式编程,那么这是一个不同的故事.您需要了解自己正在做什么,需要多长时间,以及调用哪些上下文来了解您需要使用的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |