随想录(一种新的读写锁的写法)
来源:互联网 发布:sql update多行数据 编辑:程序博客网 时间:2024/06/04 17:57
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
做游戏的同学想必对云风很熟悉。这一段时间他开发的skynet和ejoy2d两个软件框架在github上很火。其中skynet是为游戏服务器开发的,可以看成是一个service框架,ejoy2d是一个客户端的代码,内容不多,主要封装了opengl的一些接口,很多人不一定看得上。
我对游戏服务器不熟,但是服务器的相关代码还是看了一些的。之前vsftpd、redis、sshd、mysqld的代码也看过不少,多少知道一点。这次趁周末将skynet的代码看了一下,收获还是蛮多的。不管是Makefile、lua、service、networking,看得出来云风在服务器上面的造诣还是很深厚的。当然,最令我感兴趣的还是其中读写锁的写法,我也是第一次看到这种写法,和linux kernel中读写锁的写法也不一样。
#ifndef _RWLOCK_H_#define _RWLOCK_H_struct rwlock {int write;int read;};static inline voidrwlock_init(struct rwlock *lock) {lock->write = 0;lock->read = 0;}static inline voidrwlock_rlock(struct rwlock *lock) {for (;;) {while(lock->write) {__sync_synchronize();}__sync_add_and_fetch(&lock->read,1);if (lock->write) {__sync_sub_and_fetch(&lock->read,1);} else {break;}}}static inline voidrwlock_wlock(struct rwlock *lock) {while (__sync_lock_test_and_set(&lock->write,1)) {}while(lock->read) {__sync_synchronize();}}static inline voidrwlock_wunlock(struct rwlock *lock) {__sync_lock_release(&lock->write);}static inline voidrwlock_runlock(struct rwlock *lock) {__sync_sub_and_fetch(&lock->read,1);}#endif
这段代码来自于rwlock.h这个文件。使用过读写锁的同学肯定比较清楚这几个函数的用法。一般先用rwlock_init初始化一下结构体。接着如果读锁的话,会使用rwlock_rlock和rwlock_runlock这对函数,当然使用写锁的话,会使用rwlock_wlock和rwlock_wunlock这对函数。读写锁一般用于读多写少的情况,因为这边没有使用基于调度的互斥函数,而是采取自旋的形式,所以这几个函数特别适合多核、且临界区内容操作特别少的情形。这也是这几个函数和普通读写锁的最大差别。
2 0
- 随想录(一种新的读写锁的写法)
- 《软件随想录》的随想
- 随想录(锁的来由和使用)
- 随想录(招聘怎样的员工)
- 随想录(linux的四个维度)
- 随想录(linux的四个维度)
- 随想录(linux的四个维度)
- 随想录(程序员的缺点)
- 随想录(程序员的缺点)
- 随想录(程序员的缺点)
- 随想录(程序员的缺点)
- 随想录(程序员的缺点)
- 随想录(程序员的缺点) .
- 随想录(程序员的缺点)
- 随想录(开源代码的学习方法)
- 随想录(开源代码的学习方法)
- 随想录(公司程序员的九层楼)
- 随想录(开源代码的学习方法)
- 【基础篇】工作流技术JBPM4.4开发入门(一)
- 信号的上升沿与周期(高速信号与高频信号)
- Bandwidth
- 如何提高算法
- android之有返回结果跳转intent
- 随想录(一种新的读写锁的写法)
- lufylegend练习(2)Animation
- FilterDispatcher已被标注为过时解决办法 >>> FilterDispatcher <<< is deprecated!
- poj 2337
- 2014 Asia Kuala Lumpur Regional Contest(吉隆坡2014)解题报告汇总
- 9X9矩阵
- 冒泡排序及优化
- JQuery中$.ajax()方法参数详解
- UVa 10318 - Security Panel (暴力 + 剪枝 + 回溯)