请教,这个多线程加锁的题目应该选什么,为啥

请问,这个多线程加锁的题目应该选什么,为啥?
请教,这个多线程加锁的题目应该选什么,为啥
------解决思路----------------------
自旋锁不会切换
------解决思路----------------------
spin_lock 

自旋锁主要是一个循环等待,减少因为拿不到锁导致的线程切换,但也仅仅是减少,不是绝对的
------解决思路----------------------
https://www.baidu.com/s?wd=pthread_spin_lock&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=10&rsv_sug1=10&rsv_t=ddd8nw5Etzjz6P9Hg%2BBJR52TzrYBBrPr1Vzfm60txp%2FeeVt4JwEADKxRtqrddYUuo%2FEF
请教,这个多线程加锁的题目应该选什么,为啥
------解决思路----------------------
第一个自旋锁,
------解决思路----------------------
引用:
Quote: 引用:

spin_lock 

自旋锁主要是一个循环等待,减少因为拿不到锁导致的线程切换,但也仅仅是减少,不是绝对的


意思是自旋锁全部是用户态?


他们之间的因果关系是
普通锁:拿锁->拿不到锁则sleep->sleep导致线程切换->线程切换导致了用户态切内核态
自旋锁:拿锁->拿不到锁则循环等待->循环导致占用CPU甚至锁bus总线->其他处理器不能使用总线
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

spin_lock 

自旋锁主要是一个循环等待,减少因为拿不到锁导致的线程切换,但也仅仅是减少,不是绝对的


意思是自旋锁全部是用户态?


他们之间的因果关系是
普通锁:拿锁->拿不到锁则sleep->sleep导致线程切换->线程切换导致了用户态切内核态
自旋锁:拿锁->拿不到锁则循环等待->循环导致占用CPU甚至锁bus总线->其他处理器不能使用总线


Pthread mutex

Mutex属于sleep-waiting类型的锁. 从 2.6.x 系列稳定版内核开始, Linux 的 mutex 都是 futex (Fast-Usermode-muTEX)锁.
futex(快速用户区互斥的简称)是一个在Linux上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具。它们第一次出现在内核开发的2.5.7版;其语义在2.5.40固定下来,然后在2.6.x系列稳定版内核中出现。
Futex 是由Hubertus Franke(IBM Thomas J. Watson 研究中心), Matthew Kirkwood,Ingo Molnar(Red Hat)和 Rusty Russell(IBM Linux 技术中心)等人创建的。
Futex 是由用户空间的一个对齐的整型变量和附在其上的内核空间等待队列构成. 多进程或多线程绝大多数情况下对位于用户空间的futex 的整型变量进行操作(汇编语言调用CPU提供的原子操作指令来增加或减少),而其它情况下,则需要通过代价较大的系统调用来对位于内核空间的等待队列进行操作(如唤醒等待的进程/线程,或 将当前进程/线程放入等待队列). 除了多个线程同时竞争锁的少数情况外,基于 futex 的 lock 操作是不需要进行代价昂贵的系统调用操作的.
.
这种机制的核心思想是通过将大多数情况下非同时竞争 lock 的操作放到在用户空间来执行,而不是代价昂贵的内核系统调用方式来执行,从而提高了效率.

 这个mutex也是经过优化的,也没有切换上下文啊?


你自己也说了,除了多个线程同时竞争锁的少数情况外,也就是说,如果mutex拿锁的时候正好就拿到了,没有其他线程和它抢,那么拿锁的这个操作不再发生内核态切换。但是这个优化对于自旋锁也一样,拿锁的时候同样不切换内核态。但是拿不到锁的情况下,mutex该切换上下文还是要切换的,但是自旋锁是不切换的,自旋锁用一个循环在那等着别人释放(除非设置了自旋时间上限,比如设置了自旋4000个指令周期,如果4000个指令周期内还没等到别人释放,则让出cpu,那么此时自旋锁也会切换上下文,但是这个自旋时间的设置不同系统有不同的实现,也就是我一开始回复的“减少因为拿不到锁导致的线程切换,但也仅仅是减少,不是绝对的”)




------解决思路----------------------
插入一下。 关键路径是指 在这个通信过程中的汇编指令不产生用户到内核的切换。而等待空闲时间产生的线程切换不属于这个范围吧吧。
这样的话, 线程(/进程)间通信postmsg, getmsg.(进程除了系统自动分配的线程时间片段外),就根本不会产生切换?
另外,线程间的CRITICAL_SECTION似乎也没有?