
etc
原子变量很难说是互斥的,因为对同一个变量的两条指令都会即时执行,程序不会在此处卡顿,像f
etch_add、store、compare_and_exchange这些操作就是如此。不过,某些指令(例如compare_and_exchange)可能会出现赋值失败的情况。对于无锁(lock - free)而言,需要处理的问题是:如果在两条原子指令之间插入了其他指令该怎么办,还有要是原子指令失败了又该如何。原子变量是构建锁的基本单元,然而锁的功能要丰富得多。例如,可以利用原子变量来实现自旋锁,但要是线程A成功将原子变量设为true后,却被操作系统调度走了,这个变量就不会改变,那么线程B即使被调度过来,也无法进入临界区(critical section),只会空转从而浪费CPU资源。要解决这个问题,只有操作系统提供的锁才能够做到,因为线程切换是在内核中完成的,操作系统掌握着所有的信息。最后说到分布式和消息传递,只要存在数据交换就会有并发情况。可以借助消息传递来实现并发访问,比如线程A给线程B发送消息,从而实现对数据的访问和修改。不过这里的线程B必须有一个消息队列来接收消息,线程A也需要有队列来接收结果。这两个队列需要是线程安全的,可以是基于锁的队列,也可以是无锁的队列。除非线程A和线程B完全不会相互访问数据,不存在并发问题。