【问题标题】:Range Locks in C++C++ 中的范围锁
【发布时间】:2018-04-19 21:54:50
【问题描述】:

我想在 C++ 中锁定一个内存区域。

我有一个循环的内存缓冲区。生产者线程写入缓冲区,消费者线程从缓冲区读取。这两个进程只有在访问内存的重叠区域时才需要同步。

在 c++ 标准库(或任何与此相关的库)中是否有一个类可以用来在内存区域上构建锁?

如果没有,这里有什么好的方法?

【问题讨论】:

  • 这个内存区域的锁与通用锁又名互斥锁有何不同?
  • 正确 - 因为它具有范围语义。基本上,我想在一个线程中使用 lock(10, 50) 并在另一个线程中锁定 (40, 90) - 第二个应该是阻塞的,因为 40 在 (10, 50) 内。
  • 我怀疑任何库都会有它,很可能你必须自己实现一个,可能使用std::mutexstd::condition_variable
  • 这就是我的想法,但我想我会检查一下。
  • 你可以试试 std::atomic。

标签: c++ multithreading locking


【解决方案1】:

如果性能是一个问题,我不会考虑 std::mutex / std::condition_variable。这是我能想到的最好的:

有 2 个成员的单身人士。

std::atomic<__uint128_t> write_range, read_range;

然后将它们用于写入范围 1000 到 1999 和读取范围 500 到 1499,如下所示:

singleton::instance()->write_range = (__uint128_t) 1999 << 64 | 1000;
singleton::instance()->read_range = (__uint128_t) 1499 << 64 | 500;

这应该是无锁设置/比较的最有效方式。检测冲突:

bool clash(std::atomic<__uint128_t> const& w, std::atomic<__uint128_t> const& r) {
  return w >> 64 > r >> 64 && ((size_t)w <= (size_t)(r >> 64)) ;
}

【讨论】:

    猜你喜欢
    • 2017-11-06
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多