加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX环境高级编程:线程同步之读写锁及属性

发布时间:2016-08-01 18:21:11 所属栏目:Unix 来源:站长网
导读:读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个

(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;  
}

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读