本文共 2661 字,大约阅读时间需要 8 分钟。
目录
以下内容摘自
读写锁也叫共享互斥锁:读模式共享和写模式互斥,本质上这种非常合理,因为在数据没有被写的前提下,多个使用者读取时完全不需要加锁的。读写锁有读加锁状态、写加锁状态和不加锁状态三种状态,当读写锁在写加锁模式下,任何试图对这个锁进行加锁的线程都会被阻塞,直到写进程对其解锁。
读优先的读写锁:读写锁rwlock默认的也是读优先,也就是:当读写锁在读加锁模式先,任何线程都可以对其进行读加锁操作,但是所有试图进行写加锁操作的线程都会被阻塞,直到所有的读线程都解锁,因此读写锁很适合读次数远远大于写的情况。这种情况需要考虑写饥饿问题,也就是大量的读一直轮不到写,因此需要设置公平的读写策略。在一次面试中曾经问到实现一个写优先级的读写锁,感兴趣的可以想想如何实现。
gcc bulid-in的一些API:
原子操作:
type __sync_fetch_and_add (type *ptr, type value, ...);type __sync_fetch_and_sub (type *ptr, type value, ...);type __sync_fetch_and_or (type *ptr, type value, ...);type __sync_fetch_and_and (type *ptr, type value, ...);type __sync_fetch_and_xor (type *ptr, type value, ...);type __sync_fetch_and_nand (type *ptr, type value, ...);type __sync_add_and_fetch (type *ptr, type value, ...);type __sync_sub_and_fetch (type *ptr, type value, ...);type __sync_or_and_fetch (type *ptr, type value, ...);type __sync_and_and_fetch (type *ptr, type value, ...);type __sync_xor_and_fetch (type *ptr, type value, ...);type __sync_nand_and_fetch (type *ptr, type value, ...);type可以是如下类型:__sync_fetch_and_add,速度是线程锁的6~7倍type可以是1,2,4或者8字节长度的int类型,即:int8_tuint8_tint16_tuint16_tint32_tuint32_tint64_tuint64_t关于type不需要特别声明,直接使用即可
样例代码如下:
#includeint main(int argc, char **argv){ int n=10; __sync_fetch_and_add(&n, 1); printf("++%d\n",n); __sync_fetch_and_sub(&n, 1); printf("--%d\n",n); __sync_fetch_and_xor(&n, 1); printf("m^n:%d\n",n); return 0;}
结果如下:
++11--10m^n:11
//以下两个函数提供原子的比较和交换, 如果*ptr = oldValue, 就将newValue写入*ptr//第一个函数在相等并写入的情况下返回true//第二个函数返回操作之前的值bool __sync_bool_compare_and_swap(type* ptr, type oldValue, type newValue, ....);type __sync_val_compare_and_swap(type* ptr, type oldValue, type newValue, ....);//将*ptr设为value并返回*ptr操作之前的值type __sync_lock_test_and_set(type *ptr, type value, ....);//置*ptr为0void __sync_lock_release(type* ptr, ....);
PHP的自旋锁,使用了 __sync_bool_compare_and_swap
以上图片转自:
1.
gcc中内置的原子操作__sync_fetch_and_add的实现在哪个文件里?
2.
3.Linux 自旋锁介绍:
转载地址:http://aopbi.baihongyu.com/