以只读模式对结构进行线程锁定(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)的主要内容,如果未能解决你的问题,请参考以下文章

【软件】终于能修改macOS系统只读文件了!

以只读模式打开 JdbcTemplate 连接?

了解什么是不变模式

了解 C11 类型层次结构

C11线程管理:条件变量