DrY*_*Yap 4 theory concurrency multithreading mutex thread-safety
我对互斥体的工作原理感兴趣.我了解他们的目的,因为我找到的每个网站都解释了他们的所作所为,但我无法理解在这种情况下会发生什么:
有两个线程同时运行,它们试图同时锁定互斥锁.
这在单核上不会出现问题,因为这种情况永远不会发生,但在多核系统中,我认为这是一个问题.我看不出有任何方法可以防止这样的并发问题,但它们显然存在.
谢谢你的帮助
2个线程无法锁定系统范围的互斥锁,一个将锁定它,另一个将被阻止.
互斥锁/锁的语义!确保在任何时候只有一个线程可以在锁定调用之外执行.到达调用的第一个线程获取互斥锁上的锁.任何以后的线程都会在调用mutex/lock时阻塞!直到拥有锁的线程释放锁与mutex/unlock !.
就如何实现这一点而言,看看测试和设置.
在计算机科学中,测试和设置指令是用于写入存储器位置并将其旧值作为单个原子(即,不可中断)操作返回的指令.如果多个进程可以访问同一个内存,并且进程当前正在执行测试和设置,则在第一个进程完成之前,其他任何进程都不会开始另一个测试和设置.CPU可以使用其他电子组件提供的测试和设置指令,例如双端口RAM; CPU也可以自己提供测试和设置指令.
如果旧值为0,则调用进程获取锁定.它将1写入变量,直到发生这种情况.
小智 7
正确实现互斥锁时,永远不能同时锁定互斥锁.为此,您需要一些具有有用属性的原子操作(保证在某一时刻发生在对象上的唯一操作).
一个这样的操作是xchgx86架构中的(交换).例如,xchg eax, [ebp]将读取地址处的值,将值ebp写入eax地址ebp,然后设置eax为读取值,同时保证这些操作不会与对该地址的并发读取和写入交错.
现在您可以实现互斥锁.要锁定,负载1进入eax,交流eax与互斥的值,看看eax.如果是1,它已被锁定,所以您可能想要睡觉并稍后再试.如果是0,你只需锁定互斥锁即可.要解锁,只需将值写入0互斥锁即可.
请注意,我在这里重点介绍了重要细节.例如,x86的xchg原子性足以在单个处理器上进行先发制人的多任务处理.当您在多个处理器之间共享内存时(例如在多核系统中),除非您使用lock前缀(例如lock xchg eax, [ebp],而不是xchg eax, [ebp]),这将是不够的,这确保只有一个处理器可以在指令时访问该内存被执行.