Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 范围锁定在C++;_C++_Multithreading_Locking - Fatal编程技术网

C++ 范围锁定在C++;

C++ 范围锁定在C++;,c++,multithreading,locking,C++,Multithreading,Locking,我想在C++中锁定一个内存区域。 我有一个循环的内存缓冲区。生产者线程写入缓冲区,消费者线程从缓冲区读取。这两个进程只有在访问重叠的内存区域时才需要同步 是否有C++类库中的类(或任何一个库),我可以用来在内存区域上建立一个锁? 如果不是,这里有什么好的方法? < P>如果性能是一个问题,我就不考虑STD::互斥/STD::条件变量。这是我能想到的最好的: 有2名成员的单身人士 std::atomic<__uint128_t> write_range, read_range; st

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

是否有C++类库中的类(或任何一个库),我可以用来在内存区域上建立一个锁?


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

< P>如果性能是一个问题,我就不考虑STD::互斥/STD::条件变量。这是我能想到的最好的:

有2名成员的单身人士

std::atomic<__uint128_t> write_range, read_range;
std::原子写入范围、读取范围;
然后将其用于写入范围1000到1999和读取范围500到1499,如下所示:

singleton::instance()->write_range = (__uint128_t) 1999 << 64 | 1000;
singleton::instance()->read_range = (__uint128_t) 1499 << 64 | 500;
singleton::instance()->write_range=(u uint128_t)1999 read_range=(u uint128_t)1499>64>r>>64&((size_t)w>64));
}

内存区域的锁与通用锁(又称互斥锁)有何不同?对,因为它具有范围语义。基本上,我想在一个线程中加锁(10,50),在另一个线程中加锁(40,90)——第二个线程应该是block,因为40在(10,50)之内。我怀疑任何库都不会有它,很可能您必须自己实现一个,可能需要使用
std::mutex
std::condition\u variable
这就是我的想法,但我想我会检查一下。您可以尝试std::atomic。
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)) ;
}