假设你有一些代码可以读写数据结构。如果您有多个线程执行此代码(并共享数据结构),是否有一些安排可以实现以下目的:
在任何读取和任何写入期间锁定的单个互斥锁实现目标2和3,但未能实现目标1.是否有一些解决方案可实现所有三个目标?
假设不可能设计一种方案,其中数据结构的不同子部分可以用不同的互斥锁保护。
我笨拙的做法是:
每个线程都有一个互斥锁,每个线程在需要读取时都会锁定自己的互斥锁。
有一个额外的'全球'互斥。当任何线程想要写时,它首先锁定这个全局互斥锁。然后它在所有特定于线程的互斥锁上经历pthread_mutex_trylock()的循环,直到它全部锁定它们,然后执行写入,然后将它们全部解锁。最后,它解锁了全局互斥锁。
然而,这种方法可能效率不高。
提前致谢,
亨利
答案 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
溢出的情况。