UNIX环境高级编程:线程同步之读写锁及属性
|
(1)pthread_rwlock_rdlock()系列函数 pthread_rwlock_rdlock()用于以读模式即共享模式获取读写锁,如果读写锁已经被某个线程以写模式占用,那么调用线程就被阻塞。如果读写锁已经被某个线程以写模式占用,那么调用线程将获得读锁。如果读写锁未没有被占有,但有多个写锁正在等待该锁时,调用线程现在试图获取读锁,是否能获取该锁是不确定的。在实现读写锁的时候可以对共享模式下锁的数量进行限制(目前不知如何限制)。 pthread_rwlock_tryrdlock()和pthread_rwlock_rdlock()的唯一区别就是,在无法获取读写锁的时候,调用线程不会阻塞,会立即返回,并返回错误代码EBUSY。 针对未初始化的读写锁调用pthread_rwlock_rdlock/pthread_rwlock_tryrdlock,则结果是不确定的。 pthread_rwlock_timedrdlock()是限时等待读模式加锁,时间参数struct timespec * abstime也是绝对时间。 (2)pthread_rwlock_wrlock()系列函数 pthread_rwlock_wrlock()用于写模式即独占模式获取读写锁,如果读写锁已经被其他线程占用,不论是以共享模式还是独占模式占用,调用线程都会进入阻塞状态。 pthread_rwlock_trywrlock()在无法获取读写锁的时候,调用线程不会进入睡眠,会立即返回,并返回错误代码EBUSY。 针对未初始化的读写锁调用pthread_rwlock_wrlock/pthread_rwlock_trywrlock,则结果是不确定的。 pthread_rwlock_timedwrlock()是限时等待写模式加锁。 (3)pthread_rwlock_unlock() 无论以共享模式还是独占模式获得的读写锁,都可以通过调用pthread_rwlock_unlock()函数进行释放该读写锁。 针对未初始化的读写锁调用pthread_rwlock_unlock,则结果是不确定的。 注意:当读写锁以读模式被占有N次,即调用pthread_rwlock_rdlock() N次,且成功。则必须调用N次pthread_rwlock_unlock()才能执行匹配的解锁操作。 示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#define MAXDATA 1024
#define MAXREDER 100
#define MAXWRITER 100
struct
{
pthread_rwlock_t rwlock; //读写锁
char datas[MAXDATA]; //共享数据域
}shared = {
PTHREAD_RWLOCK_INITIALIZER
};
void *reader(void *arg);
void *writer(void *arg);
int main(int argc,char *argv[])
{
int i,readercount,writercount;
pthread_t tid_reader[MAXREDER],tid_writer[MAXWRITER];
if(argc != 3)
{
printf("usage : <reader_writer> #<readercount> #<writercount>n");
exit(0);
}
readercount = atoi(argv[1]); //读者个数
writercount = atoi(argv[2]); //写者个数
pthread_setconcurrency(readercount+writercount);
for(i=0;i<writercount;++i)
pthread_create(&tid_writer[i],NULL,writer,NULL);
sleep(1); //等待写者先执行
for(i=0;i<readercount;++i)
pthread_create(&tid_reader[i],NULL,reader,NULL);
//等待线程终止
for(i=0;i<writercount;++i)
pthread_join(tid_writer[i],NULL);
for(i=0;i<readercount;++i)
pthread_join(tid_reader[i],NULL);
exit(0);
}
void *reader(void *arg)
{
pthread_rwlock_rdlock(&shared.rwlock); //获取读出锁
if( pthread_rwlock_rdlock(&shared.rwlock) ==0 ) //获取读出锁
printf("pthread_rwlock_rdlock OKn");
printf("Reader begins read message.n");
printf("Read message is: %sn",shared.datas);
pthread_rwlock_unlock(&shared.rwlock); //释放锁
if( pthread_rwlock_unlock(&shared.rwlock) != 0 );
printf("pthread_rwlock_unlock failn");
return NULL;
}
void *writer(void *arg)
{
char datas[MAXDATA];
pthread_rwlock_wrlock(&shared.rwlock); //获取写锁
if( pthread_rwlock_wrlock(&shared.rwlock) != 0)//再次获取写锁
perror("pthread_rwlock_wrlock");
if( pthread_rwlock_rdlock(&shared.rwlock) !=0 ) //获取读出锁
perror("pthread_rwlock_rdlock");
printf("Writers begings write message.n");
sleep(1);
printf("Enter the write message: n");
scanf("%s",datas); //写入数据
strcat(shared.datas,datas);
pthread_rwlock_unlock(&shared.rwlock); //释放锁
return NULL;
} (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


