【问题标题】:Thread-locking a structure in read only mode (C11 stdatomic)在只读模式下线程锁定结构(C11 stdatomic)
【发布时间】:2018-01-02 18:10:52
【问题描述】:

我已经使用 stdatomic 创建了一个类似互斥锁的锁函数,基本上可以

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

还有另一个解锁函数,该函数仅在 locklevel==0 时降低锁定级别并将地址设置回零(这允许在调用调用另一个锁的函数之前锁定,使其仍保持锁定状态)

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

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

【问题讨论】:

  • Writer starvation 是一个经过充分探索的问题,但如果不了解最终系统的预期特征,就不容易解决。您是否考虑过读者与作家的比例?读写操作的长度?除了 RW 锁之外,还有许多其他因素和几种不同的解决方案。例如,您是否考虑过让数据在写入时复制?
  • @DarkFalcon 我的结构包含指向动态分配内存的指针,因此这种方法对我不起作用
  • 当然可以。深度复制所有内容或保留一个计数器来记录给定外部指针有多少引用。无论如何,如果您需要帮助选择一种方法,您将不得不回答其他问题。
  • @DarkFalcon 是的,但是分配的内存数组可能很长,而且 malloc 本身就是一项昂贵的操作
  • 除非您每 5 分钟或其他时间只更改一次,在这种情况下,成本可能并不重要。 您仍然需要指定系统的性能特征。

标签: c multithreading locking mutex atomic


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多