`

IPC Read/Write Lock

 
阅读更多

读写锁

<!--[if !supportLists]-->1、 <!--[endif]-->函数列表

<!--[if !supportLists]-->Ø <!--[endif]-->int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

此函数获取一个读出锁,如果对应的读出锁已由某个写入者持有,那就阻塞调用线程;

此函数获取一个写入锁,如果对应的读写锁已由另一个写入者持有,或者已由一个或多个读出者持有,那就阻塞调用线程;

此二函数尝试获取一个读出锁或写入锁,但是如果该锁不能马上取得,那就返回一个EBUSY错误,而不是把调用线程投入睡眠。

此函数对读写锁进行解锁。

<!--[if !supportLists]-->Ø <!--[endif]-->int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,

const pthread_rwlockattr_t *restrict attr);

PTHREAD_RWLOCK_INITIALIZER

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

动态和静态初始化读写锁;

销毁读写锁。

<!--[if !supportLists]-->Ø <!--[endif]-->int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);

int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

初始化和销毁读写锁属性变量。

<!--[if !supportLists]-->Ø <!--[endif]-->int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *

restrict attr, int *restrict pshared);

int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr,

int pshared);

获得读写锁属性变量具体值。

<!--[if !supportLists]-->Ø <!--[endif]-->int pthread_cancel(pthread_t thread);

void pthread_cleanup_pop(int execute);

void pthread_cleanup_push(void (*routine)(void*), void *arg);

线程取消函数

<!--[if !supportLists]-->2、 <!--[endif]-->实例解析

读写锁的基本使用;线程取消的使用。

//testcancel.c

#include <pthread.h>

pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

pthread_t tid1, tid2;

void *thread1(void *), *thread2(void *);

int

main(int argc, char **argv)

{

void *status;

// Set_concurrency(2);

pthread_create(&tid1, NULL, thread1, NULL);

sleep(1); /* let thread1() get the lock */

pthread_create(&tid2, NULL, thread2, NULL);

pthread_join(tid2, &status);

if (status != PTHREAD_CANCELED)

printf("thread2 status = %p/n", status);

pthread_join(tid1, &status);

if (status != NULL)

printf("thread1 status = %p/n", status);

// printf("rw_refcount = %d, rw_nwaitreaders = %d, rw_nwaitwriters = %d/n",

// rwlock.rw_refcount, rwlock.rw_nwaitreaders,

// rwlock.rw_nwaitwriters);

pthread_rwlock_destroy(&rwlock);

printf("main over/n");

sleep(5);

exit(0);

}

void * thread1(void *arg)

{

pthread_rwlock_rdlock(&rwlock);

printf("thread1() got a read lock/n");

sleep(3); /* let thread2 block in pthread_rwlock_wrlock() */

printf("cancel thread2/n");

pthread_cancel(tid2);

sleep(3);

printf("thread1 unlock rdlock/n");

pthread_rwlock_unlock(&rwlock);

return(NULL);

}

void * thread2(void *arg)

{

printf("thread2() trying to obtain a write lock/n");

pthread_rwlock_wrlock(&rwlock); //发生阻塞,因为已经有读锁

printf("thread2() got2 a write lock/n"); /* should not get here */

sleep(1);

printf("thread2 unlock wrlock/n");

pthread_rwlock_unlock(&rwlock);

return(NULL);

}

//gcc testcancel.c –lpthread –o testcancel

<!--[if !supportLists]-->3、 <!--[endif]-->小结

<!--[if !supportLists]-->Ø <!--[endif]-->互斥锁与读写锁的区别

当访问临界区资源时(访问的含义包括所有的操作:读和写),需要上互斥锁;

当对数据(互斥锁中的临界区资源)进行读取时,需要上读取锁,当对数据进行写入时,需要上写入锁。

<!--[if !supportLists]-->Ø <!--[endif]-->读写锁的优点

对于读数据比修改数据频繁的应用,用读写锁代替互斥锁可以提高效率。因为使用互斥锁时,即使是读出数据(相当于操作临界区资源)都要上互斥锁,而采用读写锁,则可以在任一时刻允许多个读出者存在,提高了更高的并发度,同时在某个写入者修改数据期间保护该数据,以免任何其它读出者或写入者的干扰。

<!--[if !supportLists]-->Ø <!--[endif]-->读写锁描述

获取一个读写锁用于读称为共享锁,获取一个读写锁用于写称为独占锁,因此这种对于某个给定资源的共享访问也称为共享-独占上锁。

有关这种类型问题(多个读出者和一个写入者)的其它说法有读出者与写入者问题以及多读出者-单写入者锁。

<!--[if !supportLists]-->Ø <!--[endif]-->实现

读写锁可以容易地仅仅使用互斥锁和条件变量来实现,可以优先考虑等待着的写入者,有的实现优先考虑等待着的读出者。【写入锁unlock后,这个锁到底是给另外一个写入者线程,还是另外的读出者线程呢】

分享到:
评论

相关推荐

    商业编程-源码-共享内存封装类2.zip

    2. 数据存取:封装`std::shared_ptr&lt;char&gt;`或`std::unique_ptr&lt;char&gt;`来管理内存,提供`write`和`read`方法供用户读写数据,确保线程安全(可能需要互斥锁或原子操作)。 3. 销毁和清理:析构函数中,检查当前进程...

    UNIX Network Programming Volume 2(Unix网络编程卷2英文版)

    8.3 read--write lock attributes 179 8.4 implementation using mutexes and condition variables 179 8.5 thread cancellation 187 8.6 summary 192 chapter 9. record locking 9.1 introduction 193 9.2 ...

    《UNIX环境高级编程》在unix/linux应用开发

    - **同步机制**:除了互斥锁之外,还包括条件变量(condition variable)、读写锁(read-write lock)等。 ##### 2.4 网络编程 - **套接字(socket)**:Unix/Linux系统中网络通信的主要接口,支持TCP/IP等多种协议。 - *...

    Java_Reader_Writer.rar_java reader writ_读者写者

    Java语言在实现进程间通信(IPC)时,经常会遇到一些经典问题,其中之一就是读者写者问题。这是一个关于并发控制的问题,旨在确保多个读者可以同时访问共享资源,而当有写者时,所有读者和写者都不能同时访问。在这...

    Linux程序设计(包含线程 进程 网路编程)

    Linux支持多种同步原语,如互斥锁(mutex)、条件变量(condition variable)、信号量(semaphore)和读写锁(read-write lock)。这些工具确保了对共享资源的安全访问,防止数据不一致。 在网络编程方面,Linux...

    linux消息队列.pdf

    接着定义了消息队列结构体MSGQUEUE,它包含一个互斥锁pthread_mutex_t lock、一个信号量sem_t wait、一个指向消息数组的指针msg、队列大小int size、读操作次数int read_ops以及写操作次数int write_ops。...

    UNIX环境高级编程第二版

    - **进程同步**:探讨互斥锁(mutex)、读写锁(read-write lock)等同步机制的使用方法。 #### 五、网络通信技术 - **Socket编程**: - **基础知识**:介绍Socket的工作原理,TCP/IP协议栈的基本概念。 - **客户端...

    操作系统实验报告.zip

    主要知识点有:线程的创建与销毁(如使用pthread库)、互斥锁(mutex)用于保护共享资源、条件变量(condition variable)实现线程间的协作、读写锁(read-write lock)以优化对共享数据的访问效率。 3. 多线程实现...

    boost_interprocess.7z

    boost::interprocess::shared_memory_object shm(boost::interprocess::open_or_create, "MySharedMemory", boost::interprocess::read_write); ``` 2. 初始化内存区域。 ```cpp shm.truncate(1000); // 设置大小 ...

    30道-内核经典-面试题.pdf

    - **读写信号量(Read-Write Semaphores)**:允许多个读者同时访问,但写入时会独占资源。 - **大内核锁(Big Kernel Lock, BKL)**:早期Linux内核用于全局同步,但在多核环境下效率较低,现在已逐渐被淘汰。 -...

    《LINUX/UNIX系统编程手册》.((德)Michael Kerrisk )随书代码完整版

    3. **文件I/O**:详细阐述了标准I/O库、低级I/O(open()、read()、write()等)和磁盘文件操作,包括文件描述符、文件状态标志等。 4. **套接字网络编程**:介绍了TCP/IP网络编程,包括socket()、bind()、listen()、...

    VC++的内存共享方法

    CHandle hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(SomeDataStruct), _T("SharedData")); ``` 这里的`SomeDataStruct`是你打算共享的数据结构。`CreateFileMapping`...

    Linux多线程服务端编程:使用muduo C++网络库.pdf

    - 同步原语的应用:在多线程编程中,同步原语如互斥锁(mutex)、条件变量(condition variable)、读写锁(read-write lock)、信号量(semaphore)是管理资源访问和线程同步的基本工具。 - 日志管理和性能优化:在...

    重庆大学操作系统第二次实验

    3. **线程同步**:掌握互斥锁(mutex)、条件变量(condition variable)、读写锁(read-write lock)等同步机制,防止竞态条件,确保数据一致性。 4. **调度策略**:了解不同的调度算法,如FCFS(先来先服务)、...

    共享内存例子

    HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, memSize, "SharedMemoryName"); LPVOID lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, memSize); // ...

    Qt进程间共享内存区例子

    标题为“Qt进程间共享内存区例子”,这个例子包括两个部分:`sharedmemory_write`(数据共享发起端)和`sharedmemory_read`(数据共享接收端)。 共享内存是一种高效的IPC机制,因为它允许多个进程直接读写同一块...

    linux网络通讯/进程线程/文件操作经典代码-华清培训资料

    `open()`, `read()`, `write()`, 和 `close()`是文件操作的基本函数。`fopen()`, `fprintf()`, `fscanf()`, `fclose()`等C标准库函数提供了更高级别的接口。同时,文件权限管理通过`chmod()`, `chown()`, 和 `chgrp...

    Concurrent programming on windows

    常见的同步工具包括互斥锁(Mutex)、条件变量(Condition Variable)、读写锁(Read-Write Lock)等。 3. **并发编程中的挑战**: - **死锁**:当两个或多个线程互相等待对方释放资源时,可能会发生死锁情况,...

    UNIX环境高级编程.pdf

    - **线程同步**:锁(mutex)、条件变量(condition variable)、读写锁(read-write lock)等。 - **多线程编程实践**:解决线程安全问题,避免死锁和竞态条件。 ##### 3. 高级文件I/O - **文件描述符管理**:了解标准...

Global site tag (gtag.js) - Google Analytics