1. 关于多线程的同步问题
使用多线程有许多我们众所周知的优点,比如响应度高、充分发挥多核处理器的性能等。但是每个线程的创建也都是有一定的成本。线程同步的官方解释 : 协同步调,让多个线程按照预定的先后顺序执行。 然而并不是所有的多线程要进行正确的工作都需要同步机制来管理。一般多线程执行,线程之间可能下面多种关系:
(1) 相对独立
比如一个负责图片下载的线程跟一个负责音频解码的线程基本上是相互独立的,虽然多线程存在,但是他们没有共享资源,不需要进行线程同步的管理。
(2)共同协作
比如多个线程同时从网络下载不同的图片,并更新数据库。只要保证更新数据库的过程是原子的就行。让多个线程的临界区不要同时执行。
(3)相互依赖
比如生产者与消费者模式,生产者要不要继续生产取决于缓冲区数据是否满了。消费者能不能继续消费取决于缓冲区是否有数据。这种除了要保证对缓冲区的原子操作之外,还要调整线程执行的顺序。
保证线程运行的成本:(内存+时间+调度+同步)
1. 线程管理块
2. 为线程分配的栈
3. 线程创建时间
4. OS对多线程进行唤醒与阻塞
5. 线程协作同步管理
所以说资源共享的控制逻辑,是多线程同步真正需要考虑的事情,这也是此文章题目为何叫《多线程资源共享的控制逻辑》,而不是简单的说多线程同步机制的原因。
2. 从原子操作讲起
原子操作的业务抽象:
在上面线程的共同协作中我们提到了原子操作。在实际的线程协作或者相互依赖过程中,我们往往要对同一资源进行访问,这些资源包括,文件,外部设备,变量等。对每个共享变量 s-obj,我们通常的访问过程是 read s-obj , calculate s-obj, write s-obj.我们把这一系列操作抽象叫做RCW吧。对于不同的业务所必须限定的临界区并不一定都是RCW模式,具体需要原子操作的部分,要根据不同的业务场景来限定。