`
东边日出西边雨
  • 浏览: 262227 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读写锁

阅读更多

    读写锁是多线程同步中的一个很有用的东东,区分开读者和写者,有助于效率的提升。

    就好像是一个签名簿,写者相当于签名的人,读者相当于看签名簿的人,写签名簿的一群人需要排队,一个一个地签名,而读者不需要排队,他们可以一起看。当一群围观的正在看时,匆匆忙忙跑来一个签名的,大喊“让开,我要迟到了,让我签到”,于是大家让开让他签了名子,这说明了什么?

    1.写者比读者优先级高,同时竞争读写锁的话,写者将获得锁。

    2.写者必须一个一个地获得锁

    3.而一群读者可以同时获得读写锁。

 

下面一段程序说明了这个道理。


                                     编译:   gcc -o a rwlock.c -lpthread

                                     运行:   ./a

 

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

#define THREADCNT 10

pthread_rwlock_t rwlock;                                                  //建立读写锁
int global_var =  1;

void* reader(void* pvoid)
{
        pthread_rwlock_rdlock(&rwlock);                               //读方式获取锁
        sleep(1);
        printf("reader %d worked. global_var = %d\n", (int)pvoid, global_var);
        if(pthread_rwlock_unlock(&rwlock)) {
                printf("reader %d unlock error!\n", (int)pvoid);
        }
        return NULL;
}
void* writer(void* pvoid)
{
        pthread_rwlock_wrlock(&rwlock);                               //写方式获得锁
        sleep(1);
        printf("writer %d worked. global_var = %d\n", (int)pvoid, global_var++);
        if(pthread_rwlock_unlock(&rwlock)) {
                printf("writer %d unlock error!\n", (int)pvoid);
        }
        return NULL;
}
int main()
{
        pthread_t reader_id, writer_id;
        pthread_attr_t threadattr;
        int i, rand;
        int readercnt = 1, writercnt = 1;
        int halfmax = RAND_MAX / 2;
        if(pthread_rwlock_init(&rwlock, NULL)) {                     //初始化读写锁
                printf("initialize rwlock error!\n");
        }
        pthread_rwlock_wrlock(&rwlock);
        pthread_attr_init(&threadattr);
        pthread_attr_setdetachstate(&threadattr, PTHREAD_CREATE_DETACHED);
        for(i = 0; i < THREADCNT; i++) {
                rand = random();
                if(rand < halfmax) {
                        pthread_create(&reader_id, &threadattr, reader,
                                                (void*)readercnt);
                        printf("Created reader %d\n", readercnt++);
                } else {
                        pthread_create(&writer_id, &threadattr, writer,
                                                (void*)writercnt);
                        printf("Created writer %d\n", writercnt++);
                }
        }
        pthread_rwlock_unlock(&rwlock);
        pthread_exit(0);
        return 0;
}
 

 

运行结果:

 

Created writer 1
Created reader 1
Created writer 2
Created writer 3
Created writer 4
Created reader 2
Created reader 3
Created writer 5
Created reader 4
Created writer 6
writer 3 worked. global_var = 1
writer 4 worked. global_var = 2
writer 5 worked. global_var = 3
writer 2 worked. global_var = 4
writer 6 worked. global_var = 5
writer 1 worked. global_var = 6
reader 2 worked. global_var = 7
reader 3 worked. global_var = 7
reader 4 worked. global_var = 7
reader 1 worked. global_var = 7
分享到:
评论

相关推荐

    WINDOWS读写锁实现

    在Windows操作系统中,读写锁(Read-Write Lock)是一种多线程同步原语,它允许多个线程同时读取共享资源,但在写入时仅允许一个线程访问。这提高了并发性能,尤其是在读操作远多于写操作的场景下。本篇文章将深入...

    windows和linux读写锁C++实现

    在多线程编程中,读写锁是一种非常重要的同步机制,它允许多个读线程同时访问共享资源,但只允许一个写线程独占资源,从而提高了并发性能。本话题将详细探讨在Windows和Linux环境下,如何使用C++来实现读写锁。 ...

    易语言线程安全之原子锁与读写锁

    本文将深入探讨易语言中的原子锁与读写锁。 原子操作是一种不可分割的操作,它在执行过程中不会被其他线程中断。在易语言中,原子操作常用于更新计数器、标志位等简单数据类型的场景,避免了线程间的竞态条件。例如...

    windows 读写锁 (基于关键区的读写锁类 及自动锁)

    其中,读写锁(Read-Write Lock,简称RWLock)是一种高效的线程同步机制,适用于大量读取操作和少量写入操作的情况。在本文中,我们将深入探讨基于关键区的Windows读写锁类及其自动锁的实现原理和改进点。 读写锁的...

    java 读写锁代码

    Java 读写锁是Java并发编程中的一种重要机制,它为多线程环境下的数据访问提供了更为精细的控制。在Java的`java.util.concurrent.locks`包中,`ReentrantReadWriteLock`类实现了读写锁的功能。这个锁允许多个读取者...

    C#使用读写锁三行代码简单解决多线程并发的问题

    为了解决这个问题,我们可以利用C#中的读写锁(ReaderWriterLockSlim)来实现线程同步。本文通过三行代码展示了如何使用读写锁解决多线程并发写入文件的冲突。 读写锁的核心在于,它允许多个线程同时读取资源,但只...

    linux写优先的读写锁设计

    linux写优先的读写锁设计 在 Linux 操作系统中,有两种基本机制来实现数据互斥,即信号量(semaphore)和自旋锁(spinlock)。本文将讨论一种特殊的自旋锁变种,即读写锁(read-write lock),它允许多个进程同时...

    linux下实现高性能读写锁(read/write lock)

    在Linux系统中,读写锁(Read/Write Locks,简称rwlocks)是一种多线程同步机制,它允许多个线程同时进行读操作,但只允许一个线程执行写操作。这种锁的设计目的是提高并发性能,特别是当读操作远多于写操作时。在...

    C#解决SQlite并发异常问题的方法(使用读写锁)

    本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,...作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标。 using System; using System.Collections.Generic; using System.Text;

    同步 读写锁 readwriteLock

    ### 同步机制中的读写锁 (Read-Write Lock) #### 概述 在多线程编程中,读写锁是一种特殊的同步机制,用于解决读者写者问题。它允许多个线程同时读取共享资源,但只允许一个线程写入资源。这种机制通过将读操作和...

    读写锁实现例子

    在这个例子中,我们讨论了如何使用读写锁(Read-Write Lock)来实现多线程环境中的并发访问控制。读写锁是一种高级的同步机制,它允许多个线程同时读取共享资源,但只允许一个线程进行写操作。这在数据读取远比写入...

    操作系统实验--读写锁

    操作系统中的读写锁是一种多线程同步机制,用于在并发环境中高效地管理共享资源的访问。在计算机系统中,特别是当多个线程需要同时访问同一数据时,读写锁能够提供一种策略,允许多个线程同时读取资源,但只允许一个...

    基于zookeeper实现的分布式读写锁

    本文将深入探讨基于Zookeeper实现的分布式读写锁,并利用Zkclient客户端进行操作。Zookeeper是一个分布式服务协调框架,它提供了一种简单且高效的方式来实现分布式锁。 **一、Zookeeper简介** Zookeeper是由Apache...

    易语言读写锁1.2模块源码

    易语言读写锁1.2模块源码例程程序调用API函数实现读写锁功能的操作。点评:读写锁实际是一种特殊的锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则对共享资源进行写操作。这种锁相...

    读写锁_读写锁_

    读写锁是多线程编程中的一个重要概念,用于提高并发访问数据时的效率。在并发环境中,如果多个线程同时读取数据,通常不会产生冲突,而写入数据时则可能引发问题。读写锁正是为了解决这个问题,它允许多个读取线程...

    简单读写锁实例代码

    在C++编程中,读写锁(Read-Write Lock)是一种多线程同步机制,它允许多个线程同时读取共享资源,但只允许一个线程写入。这种锁机制提高了对共享数据的并发访问效率,是并发编程中常用的一种工具。本实例将通过代码...

    读写锁源代码(C#编写)

    读写锁是多线程编程中的一个重要概念,它在C#中被广泛应用于提高并发访问数据的效率。本文将深入探讨C#中的读写锁及其使用,帮助你理解和掌握这一关键技能。 首先,读写锁提供了对共享资源的细粒度控制。在C#中,`...

    mysql读写锁演示案例

    ### MySQL读写锁知识点详解 #### 一、读写锁概念与特征 在数据库系统中,锁机制是一种非常重要的并发控制手段,它主要用于确保多用户同时访问数据时的一致性和完整性。MySQL作为一款广泛使用的开源关系型数据库...

    标准C写的线程池和读写锁

    在IT领域,线程池和读写锁是两种重要的多线程编程技术,尤其是在Linux操作系统中。本项目提供了一个标准C语言实现的线程池,同时整合了读写锁的实现,这对于提升程序的并发性能和资源管理具有重要意义。 线程池是一...

    linux 读写锁应用实例

    inux 读写锁应用实例 /*使用读写锁实现四个线程读写一段程序的实例,共创建了四个新的线程,其中两个线程用来读取数据,另外两个线程用来写入数据。在任意时刻,如果有一个线程在写数据,将阻塞所有其他线程的任何...

Global site tag (gtag.js) - Google Analytics