我创建了一个类似互斥锁的锁定函数,其基本上是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操作的饥饿......任何想法?
答案 0 :(得分:1)
您可以尝试使用优先级进行读写操作。我假设您的系统中的rw /读取率很低。为rw请求实现基本队列,并且当队列中有rw请求等待时,阻止读取请求获取锁定。当前读取请求完成后,获取rw的锁定并等待它完成。因此,只要有一个rw请求在队列中等待或当前正在运行,就阻止读取请求。当rw线程解锁并且队列中没有更多的rw请求允许读取请求获取锁定时。
您可能还需要使用条件变量并根据您的实现发出信号。