易截截图软件、单文件、免安装、纯绿色、仅160KB

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下的ftp工具及中文乱码的解决

安装gftp
yum install gftp
默认状态下gftp是没有设置字符编码的,所以我们上FTP的时候,看到里面的中文文件名全部是乱码,或则不部分文件看到文件夹却没名字;
其实在gftp-2.0.17以后的版本都已经很好支持汉字了,我的设置方法是对它的配置文件修改即可!
一般的软件配置文件会放在用户目录下,例如我用r ......

LINUX网络编程

      网络编程和其他编程最大的区别就是:网络编程由两部分组成,客户端和服务器端。先启动服务器端、等待客户端的程序运行并建立连接;一般来说,是服务器端的程序在一个端口上监听,等待有一个客户端的程序发来请求。
      网络编程还要引入一个概念:协议。在网络 ......

Linux下多线程(pthread)编程实例

Linux系统下的多线程遵循POSIX线程接口,称为 pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux 下pthread的实现是通过系统调用clone()来实现的。clone()是 Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查 ......

linux I2C驱动分析

I2C是Phillips开发的2线的串行总线协议。通常应用在嵌入式系统中让不同的组件通信,PC主板可以通过I2C来与不同的传感器通信。这些传感器通常报告风扇速度,处理器温度和整个硬件系统的信息,这个协议也可以用在RAM chips上,向操作系统提供DIMM的信息。
在2.0时I2C的kernel源码不在内核里的,2.4内核包括了一点对I2C的支持 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号