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 ......
在嵌入式平台上运行QTE时,使用的键盘通常不是标准键盘,而是嵌入式设备外扩的普通按键。那么实现QTE键盘输入的方
法大体上可以分为两类:
(1)编写一个普通按键驱动,然后开辟一个QT线程读取按键值,在通过信号把按键值发送出
去。需要接收键盘输入的目标,声明槽函数,接收键盘信号。
& ......
其实这才应该是这一系列文章的第一节,因为这篇文章讲的是盘古开天地的事。话说Mr.
Process是一个现代人,但是,只要是人,总该有个祖先。人们总想知道自己从哪来,然后才可以估摸算一下自己将去向何方。所以咱也要了解一下
Linux的世界里人类的起源。
图1:从上电到BIOS
按下电源开关的那个真实的人就是Linux世界里的 ......
Linux系统下的多线程遵循POSIX线程接口,称为 pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux 下pthread的实现是通过系统调用clone()来实现的。clone()是 Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查 ......
init是Linux系统里的根进程,是系统所有进程的祖先。它的主要作用是根据记录在/etc/inittab里的一个脚本(script)程序产生进程。这个文件通常用于控制用户的登录模式。Linux系统的有效登录模式有0~9共十种,不过沿用UNIX系统的至多6种的限制,一般只有1到6有效。
init一般在系统启动时自动运行,也可以由root用户调 ......