读写信号量(todo)

简介: 读写信号量的相关API有:DECLARE_RWSEM(name)该宏声明一个读写信号量name并对其进行初始化。void init_rwsem(struct rw_semaphore *sem);该函数对读写信号量sem进行初始化。

读写信号量的相关API有:

DECLARE_RWSEM(name)

该宏声明一个读写信号量name并对其进行初始化。

void init_rwsem(struct rw_semaphore *sem);

该函数对读写信号量sem进行初始化。

void down_read(struct rw_semaphore *sem);

读者调用该函数来得到读写信号量sem。该函数会导致调用者睡眠,因此只能在进程上下文使用。

int down_read_trylock(struct rw_semaphore *sem);

该函数类似于down_read,只是它不会导致调用者睡眠。它尽力得到读写信号量sem,如果能够立即得到,它就得到该读写信号量,并且返回1,否则表示不能立刻得到该信号量,返回0。因此,它也可以在中断上下文使用。

void down_write(struct rw_semaphore *sem);

写者使用该函数来得到读写信号量sem,它也会导致调用者睡眠,因此只能在进程上下文使用。

int down_write_trylock(struct rw_semaphore *sem);

该函数类似于down_write,只是它不会导致调用者睡眠。该函数尽力得到读写信号量,如果能够立刻获得,就获得该读写信号量并且返回1,否则表示无法立刻获得,返回0。它可以在中断上下文使用。

void up_read(struct rw_semaphore *sem);

读者使用该函数释放读写信号量sem。它与down_readdown_read_trylock配对使用。如果down_read_trylock返回0,不需要调用up_read来释放读写信号量,因为根本就没有获得信号量。

void up_write(struct rw_semaphore *sem);

写者调用该函数释放信号量sem。它与down_writedown_write_trylock配对使用。如果down_write_trylock返回0,不需要调用up_write,因为返回0表示没有获得该读写信号量。

void downgrade_write(struct rw_semaphore *sem);

该函数用于把写者降级为读者,这有时是必要的。因为写者是排他性的,因此在写者保持读写信号量期间,任何读者或写者都将无法访问该读写信号量保护的共享资源,对于那些当前条件下不需要写访问的写者,降级为读者将,使得等待访问的读者能够立刻访问,从而增加了并发性,提高了效率。

读写信号量适于在读多写少的情况下使用,在linux内核中对进程的内存映像描述结构的访问就使用了读写信号量进行保护。

究竟什么时候使用自旋锁什么时候使用信号量,下面给出建议的方案

当对低开销、短期、中断上下文加锁,优先考虑自旋锁;当对长期、持有锁需要休眠的任务,优先考虑信号量。

目录
相关文章
|
3月前
|
Java API 调度
线程的操作
本文详细介绍了线程的开启、终止、等待和休眠。首先解释了`start`与`run`的区别:`start`用于真正创建线程并调用系统API,而`run`则是线程执行的具体任务。接着讨论了线程终止的两种方式:通过共享标记和调用`interrupt()`方法。文中还分析了使用`join()`方法实现线程等待的机制,并展示了如何通过`Thread.sleep()`让线程休眠以降低CPU占用率。这些内容通过实例代码和图示进行了清晰说明。
31 0
线程的操作
|
4月前
|
安全 C++
利用信号量实现线程顺序执行
【8月更文挑战第25天】信号量是多线程编程中用于控制共享资源访问的关键同步机制,能有效保证线程按预设顺序执行。实现方法包括:引入相关头文件(如 C++ 中的 `<semaphore.h>`),创建信号量并通过 `sem_init` 设置初始值;在各线程函数中运用 `sem_post` 与 `sem_wait` 来传递执行权;最后,通过 `sem_destroy` 销毁信号量以释放资源。使用过程中需注意错误处理、确保线程安全及合理设定信号量初值,以维持程序稳定性和高效性。
goroutine+channel实现对多个goroutine的顺序执行
goroutine+channel实现对多个goroutine的顺序执行
|
编译器
【玩转RT-Thread】线程间同步(一) 信号量
【玩转RT-Thread】线程间同步(一) 信号量
153 0
|
消息中间件 调度
RT-Thread记录(六、IPC机制之信号量、互斥量和事件集)
上文说到 RT-Thread 对临界区的处理方式有多种,其中已经分析了关闭调度器和屏蔽中断的方式, 本文就来学学另外的线程同步方式。
729 0
RT-Thread记录(六、IPC机制之信号量、互斥量和事件集)
|
安全 C# 数据安全/隐私保护
C#(四十三)之线程Mutex互斥
Mutex(互斥体): 排他性的使用共享资源称为线程间的互斥。 使用Mutex类要比使用monitor类消耗更多的系统资源,但他可以跨越多个应用程序,在多个应用程序间同步。
212 0
C#(四十三)之线程Mutex互斥
todo:进程的同步和互斥
1、生产者--消费者问题 2、读者--写者问题 3、哲学家进餐问题
846 0