当内存被一个线程修改并被其他线程读取时,使用 pthread 和互斥锁保护内存的最佳方法是什么?
What is the best way to use pthread and mutex lock to protect a memory when it is modified by one thread and read by other threads?
我正在编写一个程序,其中一个线程在 2 个可能的操作下修改内存数组(修改数组内容,或者释放数组并通过分配一个新数组来替换它)。内存数组可以被许多线程读取,除非数组被修改或释放和替换。
我知道如何使用互斥锁让内存始终只能由一个线程修改。我如何使用它(或 c 中的其他多线程工具)允许任意数量的读取线程访问内存,写入线程修改内存时除外?
实现此目的的最佳解决方案是使用读写锁,即 pthread_rwlock_*,正如上面评论中已经回答的那样。提供更多关于它的细节。
读写锁用于共享读访问或独占写访问。当任何线程当前具有写访问权时,需要读访问权的线程无法继续。当任何其他线程具有写访问权或读访问权时,需要写访问权的线程无法继续。当reader和writer同时等待访问时,默认动作优先于其中任何一个,这个规则是可以改变的。
带参数的读写锁函数在这里解释得非常清楚:
https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032u/index.html
Whosebug 本身有一个post 大致相同:
concurrent readers and mutually excluding writers in C using pthreads
如果没有正确定义优先级并且实现没有处理太多读者等待写入完成的情况,这(读写锁)可能会导致写入线程饿死。所以也请阅读:
How to prevent writer starvation in a read write lock in pthreads
我正在编写一个程序,其中一个线程在 2 个可能的操作下修改内存数组(修改数组内容,或者释放数组并通过分配一个新数组来替换它)。内存数组可以被许多线程读取,除非数组被修改或释放和替换。
我知道如何使用互斥锁让内存始终只能由一个线程修改。我如何使用它(或 c 中的其他多线程工具)允许任意数量的读取线程访问内存,写入线程修改内存时除外?
实现此目的的最佳解决方案是使用读写锁,即 pthread_rwlock_*,正如上面评论中已经回答的那样。提供更多关于它的细节。
读写锁用于共享读访问或独占写访问。当任何线程当前具有写访问权时,需要读访问权的线程无法继续。当任何其他线程具有写访问权或读访问权时,需要写访问权的线程无法继续。当reader和writer同时等待访问时,默认动作优先于其中任何一个,这个规则是可以改变的。
带参数的读写锁函数在这里解释得非常清楚: https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032u/index.html
Whosebug 本身有一个post 大致相同: concurrent readers and mutually excluding writers in C using pthreads
如果没有正确定义优先级并且实现没有处理太多读者等待写入完成的情况,这(读写锁)可能会导致写入线程饿死。所以也请阅读: How to prevent writer starvation in a read write lock in pthreads