逐步实现TCP服务端Step02-5:是否需要同步?

两个线程协作基于“单入单出循环队列”,即:只有一个线程向队列里写数据,只有一个线程从队列里拿数据。communicator将“产品”放入g_c2s_code_queue队列,processor从该队列中取“产品”;processor将“产品”放入g_s2c_code_queue队列,communicator从中取“产品”。

负责生产的线程会向队尾写数据,然后写end变量(队尾索引);负责消费的线程只会去写begin变量(队首索引)。也就是说虽然队列是共享的,但是两个线程并没有对同一块内存施加写操作。就这一点来看是安全的。

除了写操作之外,这两个线程还都会对共享变量进行读操作。有两种情况:1. 生产者在读end的时候,消费者正在写end,或者消费者在读begin的时候,生产者正在写begin;2. 生产者在写buf的时候,消费者正在读这块buf。

对于第一种情况,因为对int型变量的赋值操作实际只对应一条机器指令,也就是说cpu在执行的时候是原子操作。一方在写int时,另一方在读的话,只有两种情况,要么读到新数据,要么读到旧数据,其实没什么影响。第二种情况,程序中的逻辑是生产者写完buf后,最后再去更新end变量。而消费者判断是否读某块buf的依据就是end变量,end的值不更新的话,消费者是不会知道buf中有数据到来的,也就是说,不会存在生产者正在向buf中写数据的时候,消费者就去读这块数据。因此这个情况也是没问题的。

综上所述,按照目前的做法,不需要进行同步处理。

<==  index  ==>