码迷,mamicode.com
首页 > 其他好文 > 详细

随想录(一种新的读写锁的写法)

时间:2014-11-23 21:45:08      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   color   使用   sp   for   文件   on   


【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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 void
rwlock_init(struct rwlock *lock) {
	lock->write = 0;
	lock->read = 0;
}

static inline void
rwlock_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 void
rwlock_wlock(struct rwlock *lock) {
	while (__sync_lock_test_and_set(&lock->write,1)) {}
	while(lock->read) {
		__sync_synchronize();
	}
}

static inline void
rwlock_wunlock(struct rwlock *lock) {
	__sync_lock_release(&lock->write);
}

static inline void
rwlock_runlock(struct rwlock *lock) {
	__sync_sub_and_fetch(&lock->read,1);
}

#endif

    这段代码来自于rwlock.h这个文件。使用过读写锁的同学肯定比较清楚这几个函数的用法。一般先用rwlock_init初始化一下结构体。接着如果读锁的话,会使用rwlock_rlock和rwlock_runlock这对函数,当然使用写锁的话,会使用rwlock_wlock和rwlock_wunlock这对函数。读写锁一般用于读多写少的情况,因为这边没有使用基于调度的互斥函数,而是采取自旋的形式,所以这几个函数特别适合多核、且临界区内容操作特别少的情形。这也是这几个函数和普通读写锁的最大差别。



随想录(一种新的读写锁的写法)

标签:style   blog   ar   color   使用   sp   for   文件   on   

原文地址:http://blog.csdn.net/feixiaoxing/article/details/41415329

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!