pthreads锁定方案允许并发读取共享数据结构

时间:2015-05-15 03:35:23

标签: concurrency pthreads mutex

假设你有一些代码可以读写数据结构。如果您有多个线程执行此代码(并共享数据结构),是否有一些安排可以实现以下目的:

  1. 允许2个或更多并发读取,无写入
  2. 禁止2次或更多次写入
  3. 与1次或多次写入同时禁止1次或多次读取
  4. 在任何读取和任何写入期间锁定的单个互斥锁实现目标2和3,但未能实现目标1.是否有一些解决方案可实现所有三个目标?

    假设不可能设计一种方案,其中数据结构的不同子部分可以用不同的互斥锁保护。

    我笨拙的做法是:

    1. 每个线程都有一个互斥锁,每个线程在需要读取时都会锁定自己的互斥锁。

    2. 有一个额外的'全球'互斥。当任何线程想要写时,它首先锁定这个全局互斥锁。然后它在所有特定于线程的互斥锁上经历pthread_mutex_trylock()的循环,直到它全部锁定它们,然后执行写入,然后将它们全部解锁。最后,它解锁了全局互斥锁。

    3. 然而,这种方法可能效率不高。

      提前致谢,

      亨利

1 个答案:

答案 0 :(得分:1)

Pthreads包括具有此行为的读写器锁。你以一种类似于互斥体的方式初始化它们 - 静态地:

pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

或与pthread_rwlock_init()动态合作。

要锁定阅读(共享),请使用pthread_rwlock_rdlock(),要锁定写入(独占),请使用pthread_rwlock_wrlock()。这些还有“trylock”和“timedlock”变体。

当然,您也可以通过pthreads互斥锁和条件变量构建这样的锁。例如,您可以将读取器端锁实现为:

pthread_mutex_lock(&mutex);
readers++;
pthread_mutex_unlock(&mutex);

作者方锁是:

pthread_mutex_lock(&mutex);
while (readers > 0)
    pthread_cond_wait(&mutex, &cond);

读者端解锁是:

pthread_mutex_lock(&mutex);
if (--readers == 0)
    pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);

作家方解锁是:

pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);

(这只是为了感兴趣 - 你最好使用内置的读写器锁,因为那些可以使用特定于体系结构的代码直接实现,这可能比使用其他pthreads原语更有效)。

另请注意,在实际实现中,您需要考虑readers溢出的情况。