Linux下利用条件变量实现读写锁
首先介绍下pthread_cond_t。 在Linux下称之为状态变量,与之相关的有下面几个API:
int pthread_cond_init (pthread_cond_t *COND,pthread_condattr_t *cond_ATTR);
int pthread_cond_signal (pthread_cond_t *COND);
int pthread_cond_broadcast (pthread_cond_t *COND);
int pthread_cond_wait (pthread_cond_t *COND, pthread_mutex_t *MUTEX);
int pthread_cond_timedwait (pthread_cond_t *COND, pthread_mutex_t *MUTEX, const struct timespec *ABSTIME);
int pthread_cond_destroy (pthread_cond_t *COND);
这里就讲下2个api,pthread_cond_signal和pthread_cond_wait,一般的用法如下:
{
pthread_mutex_lock(lock)
...
pthread_cond_wait(cond, lock);
...
pthread_cond_mutex_unlock(lock);
}
pthread_cond_wait会解锁lock,然后在cond上等待,这两步是atomic operation. 当pthread_cond_wait返回时,会同时对lock上锁. 这里我的理解是,如果获取不到lock锁,即使cond已经被激活,pthread_cond_wait依然不会返回。
{
pthread_mutex_lock(lock);
...
pthread_cond_signal(cond);
...
pthread_mutex_unlock(lock);
}
pthread_cond_signal调用之前一定会先拿到lock锁。pthread_cond_signal不会去管lock锁,只是将cond激活,接下去释放lock锁。这时候pthread_cond_wait就可以得到lock从而返回了。
言归正传,下面是利用条件变量实现的一个读写锁的例子:
typedef struct pthread_rwlock
{
int active_readers; /* -1 when writer lock locked, >0 when read lock locked */
int pending_readers;
int pending_writers;
pthread_mutex_t mutex;
pthread_cond_t ok_to_read;
pthread_cond_t ok_to_write;
} pthread_rwlock_t ;
int pthread_rwlock_init(pthread_rwlock_t * lock, pthread_rwlockattr_t *attr)
{
active_readers = 0;
pending_readers = 0;
pending_writers = 0;
pthread_mutex_init(&lock->mutex, NULL);
pthread_cond_init(&lock->ok_to_read, NULL);
pthread_cond_init(&lock->ok_to_write, NULL)
相关文档:
一、概述
谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个
普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完成。下面比较下这两种驱动。
第一种方法的好处(对应第二种方法的劣势)有:
● &nbs ......
安装gftp
yum install gftp
默认状态下gftp是没有设置字符编码的,所以我们上FTP的时候,看到里面的中文文件名全部是乱码,或则不部分文件看到文件夹却没名字;
其实在gftp-2.0.17以后的版本都已经很好支持汉字了,我的设置方法是对它的配置文件修改即可!
一般的软件配置文件会放在用户目录下,例如我用r ......
linux命令大全 cat cd
chmod chown
cp cut
名称:cat
使用权限:所有使用者
使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName
说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n ......
网络配置:
VMware安装后会有几个默认网卡,分别是Vmnet0,Vmnet1和Vmnet8,常用HOST-ONLY,Bridge和NAT联网方式。本文介绍NAT方式。
Vmware设置:
在Vmware设置好Ubuntu的网络连接方式,选择NAT
IP地址可以通过vmware>edit>virtual networking settings 查看,如下图:
NAT设 ......