当一个线程修改并由其他线程读取时,使用pthread和互斥锁来保护内存的最佳方法是什么?

时间:2016-05-07 02:05:59

标签: c multithreading pthreads mutex

我正在编写一个程序,其中一个线程在两个可能的操作下修改内存数组(修改数组内容,或者取消分配数组并通过分配新数组替换它)。除非修改或取消分配和替换阵列,否则许多线程都可以读取内存阵列。

我知道如何使用互斥锁来允许内存一直只被一个线程修改。我怎样才能使用它(或c中的其他多线程工具)允许任意数量的读线程访问内存,除非写线程修改内存?

1 个答案:

答案 0 :(得分:2)

实现这一目标的最佳解决方案是使用读写锁,即pthread_rwlock_ *,如上面的评论所述。提供更多关于它的细节。

读写锁用于共享读访问或独占写访问。当任何线程当前具有写访问权限时,需要读访问权限的线程无法继续。当任何其他线程具有写访问权限或读访问权限时,需要写访问权限的线程无法继续。当读者和编写者同时等待访问时,默认操作优先于其中任何一个,可以更改此规则。

带有参数的读写锁定函数在这里有很清楚的解释: https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032u/index.html

stackoverflow中有一篇文章大致相同: concurrent readers and mutually excluding writers in C using pthreads

如果没有正确定义优先级,那么(读写锁定)可能会导致写入程序线程饿死,并且当太多读者等待编写器完成时,实现还没有处理。所以请阅读它: How to prevent writer starvation in a read write lock in pthreads