美文网首页
Linux--读写锁

Linux--读写锁

作者: 锈色的栅栏 | 来源:发表于2024-11-15 11:00 被阅读0次

 读共享,写独享,写锁优先级高

POSIX 定义的读写锁的数据类型是: pthread_rwlock_t

1、初始化读写锁

#include<pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);

可以使用宏 PTHREAD_RWLOCK_INITIALIZER 静态初始化读写锁,比如:
pthread_rwlock_t my_rwlock = PTHREAD_RWLOCK_INITIALIZER;
这种方法等价于使用 NULL 指定的 attr 参数调用 pthread_rwlock_init() 来完成动态初始化,不同之处在于PTHREAD_RWLOCK_INITIALIZER 宏不进行错误检查。

功能:
        用来初始化 rwlock 所指向的读写锁。
参数:
        rwlock:指向要初始化的读写锁指针。
        attr:读写锁的属性指针。如果 attr 为NULL 则会使用默认的属性初始化读写锁,否则
              使用指定的 attr 初始化读写锁。
返回值:
        成功:0,读写锁的状态将成为已初始化和已解锁。
        失败:非 0 错误码

2、释放读写锁

#include<pthread.h>
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

功能:
        用于销毁一个读写锁,并释放所有相关联的资源(所谓的所有指的是由pthread_rwlock_init()
        自动申请的资源) 。
参数:
        rwlock:读写锁指针。
返回值:
        成功:0
        失败:非 0 错误码

3、申请读锁

#include<pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

功能:
        以阻塞方式在读写锁上获取读锁(读锁定)。
        如果没有写者持有该锁,并且没有写者阻塞在该锁上,则调用线程会获取读锁。
        如果调用线程未获取读锁,则它将阻塞直到它获取了该锁。一个线程可以在一个读写锁上多次执行
        读锁定。线程可以成功调用 pthread_rwlock_rdlock() 函数n 次,但是之后该线程必须调用
        pthread_rwlock_unlock() 函数 n 次才能解除锁定。
参数:
        rwlock:读写锁指针。
返回值:
        成功:0
        失败:非 0 错误码

4、申请写锁

#include<pthread.h>
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

功能:
        在读写锁上获取写锁(写锁定)。
        如果没有写者持有该锁,并且没有写者读者持有该锁,则调用线程会获取写锁。
        如果调用线程未获取写锁,则它将阻塞直到它获取了该锁。
参数:
        rwlock:读写锁指针。
返回值:
        成功:0
        失败:非 0 错误码

5、释放读写锁

#include<pthread.h>
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

功能:
        无论是读锁或写锁,都可以通过此函数解锁。
参数:
        rwlock:读写锁指针。
返回值:
        成功:0
        失败:非 0 错误码

示例代码

#include<stdio.h>
#include<pthread.h>
#include<unistd.h> 
//定义一把锁
pthread_rwlock_t rwlock; 

 void* read_data01(void* arg)
{
        int *p = (int *)arg;
         while (1)
         {
                //申请上读锁
                pthread_rwlock_rdlock(&rwlock);
                printf("任务A:num=%d\n", *p);
                //解读写锁
                pthread_rwlock_unlock(&rwlock);
                sleep(1); 
         }
         return NULL;
}

void* read_data02(void* arg)
{
     int *p = (int *)arg;
    while (1)
    {
         //申请上读锁
         pthread_rwlock_rdlock(&rwlock);
         printf("任务B:num=%d\n", *p); 
         //解读写锁 
         pthread_rwlock_unlock(&rwlock);
         sleep(1);
       } 
    return NULL; 
 }

void* write_data(void* arg)

    int *p = (int *)arg;
    while (1)
   {
       //申请写锁 
      pthread_rwlock_wrlock(&rwlock); 
      (*p)++; 
      //解读写锁 
      pthread_rwlock_unlock(&rwlock); 
      printf("任务C:写入num=%d\n", *p); 
      sleep(2); 
      } 
      return NULL; 
 }

int main(int argc,char const*argv[]) 

     //定义一个公共资源
     int num = 0;
     //初始化一把锁
    pthread_rwlock_init(&rwlock, NULL);
     //创建两个线程
    pthread_t tid1, tid2, tid3;
    pthread_create(&tid1, NULL, read_data01, (void *)&num);//读
    pthread_create(&tid2, NULL, read_data02, (void *)&num);//读
    pthread_create(&tid3, NULL, write_data, (void *)&num);//写
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    pthread_join(tid3, NULL);
    //销毁锁   
    pthread_rwlock_destroy(&rwlock); 
    return 0; 
}

相关文章

  • 线程同步与互斥

    Linux--线程编程 多线程编程-互斥锁 线程同步与互斥 互斥锁 信号量 条件变量 互斥锁 互斥锁的基本使用...

  • 读写锁和互斥锁 读写互斥锁,简称读写锁 mux sync.RWMutex Lock和Unlock分别对写锁进行锁定...

  • 线程同步(下)

    继上篇。这篇介绍的几种使用的较少。 读写锁 读写锁与互斥锁类似。不过读写锁允许更高的并行性。读写锁可以有三种状态:...

  • 可重入读写锁 ReentrantReadWriteLock

    读写锁分为读锁和写锁,多个线程获取读锁不互斥,读写锁、写写锁互斥。 输出

  • Java并发编程-读写锁(ReentrantReadWriteL

    章节目录 ReentrantReadWriteLock 特性 读写锁接口示例 读写锁的实现分析读写状态设计写锁的释...

  • 线程安全之读写锁

    相关API 初始化读写锁 释放读写锁 获取读锁 获取写锁 解锁 实例

  • ReadWriteLock读写锁

    1、引入ReadWriteLock读写锁 ReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有...

  • 基于CAS的一些锁(5)- ReadWriteLock

    ReadWriteLock 读写锁。读写锁的概念其实就是共享锁和排他锁,读锁就是共享锁,写锁就是排他锁。 如何理解...

  • Go 语言的锁

    Go 语言提供两类锁: 互斥锁(Mutex)和读写锁(RWMutex)。其中读写锁(RWMutex)是基于互斥锁(...

  • 读写锁实现

    读写锁 ReentrantReadWriteLock可重入读写锁(实现ReadWriteLock接口) 使用:Re...

网友评论

      本文标题:Linux--读写锁

      本文链接:https://www.haomeiwen.com/subject/rnmzdjtx.html