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; } (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |