c++ - C++ 中的范围锁

标签 c++ multithreading locking

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

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

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

如果不是,这里采用什么好方法?

最佳答案

如果性能是个问题,我不会考虑 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)) ;
}

关于c++ - C++ 中的范围锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49930814/

相关文章:

c++ - OpenCV SVD 返回与 MATLAB 不同的结果

c++ - 函数指针如何替代 switch 语句?

c++ - 获取当前目录下的所有文件

c# - 将字典作为参数传递给线程函数

java - Java中的两个线程不是多线程

mysql - 在 MYSQL 中获取第一个解锁行

c++ - Gnu make:生成所有子目录的列表

java - Spark 中的并发作业执行

c - 关于锁定 fread/fwrite 并从不同进程调用

mysql - 在事务中锁定表