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

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

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

运行结果:

huangcheng@ubuntu:~$ gcc 2.c -lpthread  
huangcheng@ubuntu:~$ ./a.out 5 3  
pthread_rwlock_wrlock: Success  
pthread_rwlock_rdlock: Success  
Writers begings write message.  
Enter the write message:  
hu  
pthread_rwlock_wrlock: Success  
pthread_rwlock_rdlock: Success  
Writers begings write message.  
Enter the write message:  
1  
pthread_rwlock_wrlock: Success  
pthread_rwlock_rdlock: Success  
Writers begings write message.  
Enter the write message:  
2  
pthread_rwlock_rdlock OK  
Reader begins read message.  
Read message is: hu12  
pthread_rwlock_unlock fail  
pthread_rwlock_rdlock OK  
Reader begins read message.  
Read message is: hu12  
pthread_rwlock_unlock fail  
pthread_rwlock_rdlock OK  
Reader begins read message.  
Read message is: hu12  
pthread_rwlock_unlock fail  
pthread_rwlock_rdlock OK  
Reader begins read message.  
Read message is: hu12  
pthread_rwlock_unlock fail  
pthread_rwlock_rdlock OK  
Reader begins read message.  
Read message is: hu12  
pthread_rwlock_unlock fail

结果说明:

(1)当一个线程获得读写锁的写模式,其他线程试图获得该读写锁的读模式或者是写模式,都将会阻塞,直到该线程释放该读写锁。
(2)当一个线程获得读写锁的写模式,该线程试图获得该读写锁的读模式或写模式,都会立即返回失败,不会导致失败。
(3)当一个线程获得读写锁的读模式,如果该线程试图获得该读写锁的读模式,则返回成功,并在该线程释放该读写锁只需要释放一次,第二次会释放失败。
(4)当一个线程获得读写锁的读模式,且还没有释放该读写锁,如果该线程试图获得该读写锁的写模式,将导致阻塞,直到该线程释放该读写锁。
(5)当一个线程获得读写锁的写模式,该线程试图释放该写锁两次,将导致不可预测的问题。
(6)当一个线程获得读写锁的写模式或者读模式,不能读该读写锁释放两次。即不管该线程获得读锁几次,都只需要释放该读写锁一次就OK。

3读写锁的属性设置

/* 初始化读写锁属性对象 */
int pthread_rwlockattr_init (pthread_rwlockattr_t *attr);  
      
/* 销毁读写锁属性对象 */
int pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr);  
      
/* 获取读写锁属性对象在进程间共享与否的标识*/
int pthread_rwlockattr_getpshared (__const pthread_rwlockattr_t *attr,int *pshared);  
      
/* 设置读写锁属性对象,标识在进程间共享与否  */
int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared);  
      
                                                    返回值:成功返回0,否则返回错误代码

pthread_rwlockattr_setpshared()函数的第二个参数pshared用于设定是否进程间共享,其值可以是PTHREAD_PROCESS_PRIVATE或PTHREAD_PROCESS_SHARED,后者是设置进程间共享。

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/

示例代码:

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <pthread.h>  
#include <errno.h>  
      
struct{  
    pthread_rwlock_t rwlock;  
    int product;  
}sharedData = {PTHREAD_RWLOCK_INITIALIZER, 0};  
      
void * produce(void *ptr)  
{  
    int i;  
    for ( i = 0; i < 5; ++i)  
    {  
        pthread_rwlock_wrlock(&sharedData.rwlock);  
        sharedData.product = i;  
        printf("produce:%dn",i);  
        pthread_rwlock_unlock(&sharedData.rwlock);  
      
        sleep(1);  
    }  
}  
      
void * consume1(void *ptr)  
{  
    int i;  
    for ( i = 0; i < 5;)  
    {  
        pthread_rwlock_rdlock(&sharedData.rwlock);  
        printf("consume1:%dn",sharedData.product);  
        pthread_rwlock_unlock(&sharedData.rwlock);  
        ++i;  
        sleep(1);  
    }  
}  
      
void * consume2(void *ptr)  
{  
    int i;  
    for ( i = 0; i < 5;)  
    {  
        pthread_rwlock_rdlock(&sharedData.rwlock);  
        printf("consume2:%dn",sharedData.product);  
        pthread_rwlock_unlock(&sharedData.rwlock);  
      
        ++i;  
        sleep(1);  
    }  
}  
      
int main()  
{  
    pthread_t tid1, tid2, tid3;  
      
    pthread_create(&tid1, NULL, produce, NULL);  
    pthread_create(&tid2, NULL, consume1, NULL);  
    pthread_create(&tid3, NULL, consume2, NULL);  
      
    void *retVal;  
      
    pthread_join(tid1, &retVal);  
    pthread_join(tid2, &retVal);  
    pthread_join(tid3, &retVal);  
      
    return 0;  
}

(编辑:济南站长网)

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

推荐文章
    热点阅读