以只读模式对结构进行线程锁定(C11 stdatomic)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以只读模式对结构进行线程锁定(C11 stdatomic)相关的知识,希望对你有一定的参考价值。
我已经创建了一个类似互斥锁的锁定函数,它基本上具有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锁定功能(结构可以被多个函数读取,但试图写它[调用RW-lock]会让它等待)我试过简单使用公共地址而不是threadlocal。
这种方法的问题是,如果许多线程在一个循环中调用R-lock(因为锁定级别永远不会[或几乎没有]变为零),它会导致RW操作的饥饿......任何想法?
答案
您可以尝试使用优先级进行读写操作。我假设您的系统中的rw /读取率很低。为rw请求实现基本队列,并且当队列中有rw请求等待时,阻止读取请求获取锁定。当前读取请求完成后,获取rw的锁定并等待它完成。因此,只要有一个rw请求在队列中等待或当前正在运行,就阻止读取请求。当rw线程解锁并且队列中没有更多的rw请求允许读取请求获取锁定时。
您可能还需要使用条件变量并根据您的实现发信号通知它们。
以上是关于以只读模式对结构进行线程锁定(C11 stdatomic)的主要内容,如果未能解决你的问题,请参考以下文章