首页 > 系统相关 >Linux多线程11-读写锁

Linux多线程11-读写锁

时间:2023-06-26 09:12:52浏览次数:47  
标签:11 rwlock int 读写 Linux 线程 pthread mutex 多线程

当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。

但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题。

  • 在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用。

    为了满足当前能够允许多个读出,但只允许一个写入的需求,线程提供了读写锁来实现。

  • 读写锁的特点:

    • 如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作。
    • 如果有其它线程写数据,则其它线程都不允许读、写操作。
    • 写是独占的,写的优先级高。

pthread_rwlock_t: 读写锁的类型

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
                        const pthread_rwlockattr_t *restrict attr);

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

案例: 8个线程操作用一个全局变量
3个线程不定时写一个全局变量, 其他5个线程不定时读这全局变量

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int num = 1;
// pthread_mutex_t mutex;
pthread_rwlock_t rwlock;

void* writeNum(void* arg)
{
    while(1){
        pthread_rwlock_wrlock(&rwlock);
        //pthread_mutex_lock(&mutex);
        num++;
        printf("++write, tid: %ld, num: %d\n", pthread_self(), num);
        // pthread_mutex_unlock(&mutex);
        pthread_rwlock_unlock(&rwlock);

        usleep(100);
    }
    return NULL;
}

void* readNum(void* arg)
{
    while(1){
        pthread_rwlock_rdlock(&rwlock);
        // pthread_mutex_lock(&mutex);
        printf("===read, tid: %ld, num: %d\n", pthread_self(), num);
        // pthread_mutex_unlock(&mutex);
        pthread_rwlock_unlock(&rwlock);
        usleep(100);
    }
    return NULL;
}


int main(){
    //初始化读写锁
    pthread_rwlock_init(&rwlock,NULL);
    // pthread_mutex_init(&mutex,NULL);

    //创建3个写线程, 5个读线程
    pthread_t wtids[3], rtids[5];
    int i;
    for(i=0; i<3; i++){
        pthread_create(&wtids[i], NULL, writeNum, NULL);
    }
    for(i=0; i<3; i++){
        pthread_create(&rtids[i], NULL, readNum, NULL);
    }

    //设置线程分离
    for(i=0; i<3; i++){
        pthread_detach(wtids[i]);
    }
    for(i=0; i<3; i++){
        pthread_detach(rtids[i]);
    }
    
    pthread_exit(NULL);

    //销毁读写锁
    pthread_rwlock_destroy(&rwlock);
    // pthread_mutex_destroy(&mutex);

    return 0;
}

标签:11,rwlock,int,读写,Linux,线程,pthread,mutex,多线程
From: https://www.cnblogs.com/anqwjoe/p/17504455.html

相关文章

  • Linux多线程14-信号量
    信号量的类型sem_tintsem_init(sem_t*sem,intpshared,unsignedintvalue);初始化信号量参数:-sem:信号量变量地址-pshared:0用在线程间,非0用在进程间-value:信号量中的值intsem_destroy(sem_t*sem);释放资......
  • Linux多线程13-条件变量
    上节代码存在的问题:生产者已经没有数据了,消费者还在while循环判断是否有数据,浪费资源没有数据了应该通知生产者生产,生产好了通知消费者消费这就需要条件变量pthread_cond_tintpthread_cond_init(pthread_cond_t*restrictcond,constpthread_con......
  • Linux-rsyslog日志格式修改
    0.背景rsyslog是linux系统中用来实现日志功能的服务。默认已经安装,并且自动启用。作用:主要用来采集日志,不生产日志支持输出日志到各种数据库,如MySQL,PostgreSQL,MongoDBElasticSearch,等等;通过RELP+TCP实现数据的可靠传输(基于此结合丰富的过滤条件可以建立一种可靠的......
  • Linux多线程01-线程概述
    线程概述与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段。(传统意义上的UNIX进程只是多线程程序......
  • Linux多线程02-创建线程
    pthread_create描述:pthread_create()函数在调用进程中创建一个新的线程。新线程通过调用start_routine()开始执行,arg作为start_routine()的唯一参数传递。新线程以以下方式之一终止:调用pthread_exit(3),指定可供调用同一进程中pthread_join(3)的其他线程使用的退......
  • Linux多线程04-连接已终止的线程
    pthread_join描述:pthread_join()函数等待由thread指定的线程终止。如果该线程已经终止,则pthread_join()将立即返回。由thread指定的线程必须是可连接的。如果retval不为NULL,则pthread_join()将目标线程的退出状态(即目标线程提供给pthread_exit(3)的值)复制到retval指向的......
  • Linux多线程03-终止线程
    pthread_exit和pthread_self和pthread_equal描述:pthread_exitpthread_exit()函数终止调用该函数的线程,并通过retval返回一个值,如果该线程是可连接的,则在同一进程中调用pthread_join(3)的另一个线程可以获取该值。任何由pthread_cleanup_push(3)建立但尚未弹出的清理处......
  • Linux多线程07-线程属性
    线程属性类型:pthread_attr_t描述:pthread_attr_setdetachstate()函数将由attr引用的线程属性对象的分离状态属性设置为detachstate中指定的值。分离状态属性确定使用线程属性对象attr创建的线程将在可连接状态还是分离状态下创建。可以在detachstate中指定以下值:P......
  • Linux多线程06-线程取消
    pthread_cancel描述:pthread_cancel()函数向线程thread发送一个取消请求。目标线程对取消请求的响应取决于该线程控制的两个属性:其取消状态和类型。一个线程的取消状态由pthread_setcancelstate(3)确定,可以启用(对于新线程而言是默认的)或禁用。如果一个线程已禁用取消,则取消请......
  • Linux多线程05-线程的分离
    pthread_detach描述:pthread_detach()函数将由thread标识的线程标记为已分离。当一个分离的线程终止时,它的资源会自动释放回系统,而不需要另一个线程与已终止的线程加入。尝试分离一个已经分离的线程会导致未指定的行为。#include<pthread.h>intpthread_detach(pthread_tt......