摘要:
单读者单写者很容易进行冲突避免,毕竟他们操作的是不同的指针(head和rear),而多读者则需要共同操作head,多写者共同操作rear,似乎必须要加锁,锁机制是内核提供的一种对象,比较影响效率。可以借鉴spinlock的实现机制,利用CPU提供的原子指令(x86上有cmpxchg,即比较交换,当某个内存地址里的值等于某个值时,则将该地址里的内容与某个寄存器交换,这一系列操作是原子的,由CPU保证),实现CAS原子操作,意为Compare & Set(Swap?)。一种典型的CAS描述如下:bool compare_and_set(int *reg, int oldval, int n 阅读全文
摘要:
一个读线程,一个写线程,共同操作一个队列,不用锁如何避免冲突?通常用锁是因为读写线程共同操作一个count计数器,改成两个线程各操作一个计数器,每次读写之前比较两个计数器的大小。初始:head=-1;rear=0;a=0;b=0;读线程:while(a>=b);//轮询head=(head+1)%max;val=data[head];a++;return val;写线程:while(b>=a+max);//轮询data[rear]=val;rear=(rear+1)%max;b++; 阅读全文