以只读模式对结构进行线程锁定(C11 stdatomic)

时间:2018-01-02 18:10:53

标签: c multithreading locking mutex atomic

我创建了一个类似互斥锁的锁定函数,其基本上是stdatomic

do atomic_store(&zero, 0);
while (!atomic_compare_exchange_weak(&mystructure->address, &zero, threadlocal_address));
atomic_fetch_add(&structure->locklevel, 1);

和另一个解锁函数,减少locklevel并将地址设置回零只有在locklevel == 0时(这允许在调用另一个锁定的函数之前锁定,允许它仍然保持锁定状态)

这适用于RW锁定,但我也想制作一个R-lock函数(结构可以被多个函数读取,但是尝试编写它[调用RW-lock]会让它等待)而我通过简单地使用公共地址而不是线程本地来尝试。

这种方法的问题是,如果许多线程在一个循环中调用R-lock(因为锁定级别永远不会[或几乎没有]变为零),它会导致RW操作的饥饿......任何想法?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用优先级进行读写操作。我假设您的系统中的rw /读取率很低。为rw请求实现基本队列,并且当队列中有rw请求等待时,阻止读取请求获取锁定。当前读取请求完成后,获取rw的锁定并等待它完成。因此,只要有一个rw请求在队列中等待或当前正在运行,就阻止读取请求。当rw线程解锁并且队列中没有更多的rw请求允许读取请求获取锁定时。

您可能还需要使用条件变量并根据您的实现发出信号。