- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在this file ,boost::lockfree::detail::freelist
类用于管理无锁数据结构(例如队列)的存储,使用 free list .deallocate_impl
方法用于通过将节点链接回空闲列表来释放节点(已释放的节点成为空闲列表的新头部,取代旧头部)。此方法应该是线程安全且无锁的。此处复制了一个实例的原始源代码,并注释了我的注释以指出可疑代码(潜在错误?):
void deallocate_impl (index_t index)
{
freelist_node * new_pool_node =
reinterpret_cast<freelist_node*>(NodeStorage::nodes() + index);
// Shouldn't this line be placed inside the loop?
// The loop continues as long as the compare-and-exchange fails,
// which happens if the pool head has been concurrently updated.
// In that case, we MUST reload the new value of "pool_" to
// reuse its tag, link the new free-list head to it and
// compare against in the compare_and_exchange call.
tagged_index old_pool = pool_.load(memory_order_consume);
for(;;) {
// The old pool head tag is reused here without causing
// any ABA problems. However, if "index" is the same as
// old_pool.get_index(), a self-reference is written.
tagged_index new_pool (index, old_pool.get_tag());
new_pool_node->next.set_index(old_pool.get_index());
if (pool_.compare_exchange_weak(old_pool, new_pool))
return;
}
}
我在 Boost 1.62.0 中也看到了相同的实现
最佳答案
The loop continues as long as the compare-and-exchange fails, which happens if the pool head has been concurrently updated. In that case, we MUST reload the new value of "pool_" to reuse its tag...
compare_exchange_weak()
在每次调用后将 pool_
的先前值写入 old_pool
。 Documentation for compare_exchange_weak()
.
However, if "index" is the same as old_pool.get_index()...
这可能不会发生,因为具有该索引的节点尚未移至空闲列表。
关于c++ - 如果这不是 boost::lockfree::detail::freelist 中的错误,我在这里缺少什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42909951/
我比较了这三种情况使用的运行时间,它们是boost::lockfree::queue, boost::lockfree::spsc_queue 以及使用std::queue的生产者/消费者队列的串行代
有人知道无锁常用数据类型的实现(即源代码)的好资源吗?我在考虑列表、队列等? 锁定实现非常容易找到,但我找不到无锁算法的示例,以及如何准确地执行 CAS 工作以及如何使用它来实现这些结构。 最佳答案
我无法强制销毁 pop 上的 boost::lockfree::spsc_queue 元素。 (当推送覆盖循环缓冲区的元素或列表被销毁时,即使通过引用访问元素,它们也会被正确销毁)。 我也无法直接访问
Boost documentation for spsc_queue说: read_available():线程安全且无需等待,只能从生产者线程调用 write_available():线程安全且无需
我想构建一个简单的 boost::lockfree::queue不接受任何参数且不返回任何值的函数。 看来 boost::lockfree::queue要求项目类型可以轻松分配和破坏,要求 boost
考虑以下结构: struct T { ~T() { delete[] buff; } int* buff = nullptr; }; T* t = new T(); auto queue = b
我正在尝试使用标记指针来处理列表上的无锁操作,以便在此事务期间如果其他线程在列表上操作时阻止比较和交换 (CAS) 通过。我的节点结构和 CAS 如下所示: struct node { uns
我们有一个类,我们将 boost::lockfree::queue 声明为 static 数据成员并覆盖 new 和 delete 运算符。 new/delete 运算符的逻辑是创建类的实例以获取/放
编辑:这不是重复的 任何允许在 post() 中锁定互斥锁的问题。请仔细阅读,我需要一个无锁的 post()!如果您没有真正的答案,请不要标记此重复项。 信号量(如在 linux 中)是一个有用的构建
boost::lockfree::queue 对要排队的数据结构有一些要求 普通复制构造函数 琐碎的作业 普通析构函数 请举个例子 最佳答案 明显的例子基本上是任何 POD 类: struct poi
我发现将 string 指针传递给 boost::lockfree::queue 会导致内存泄漏,因为 string指针无法完全释放。 boost::lockfree::stack 的情况是否相同?
我需要缓冲一堆传入的 10GigE 数据,以便稍后将其写入磁盘。按顺序执行此操作是一个问题,因为如果我不能足够快地维护它,我正在读取的设备将会溢出。 在寻找解决方案时,我偶然发现了 boost::lo
直到现在我还在我的项目中使用 std::queue。我测量了此队列上的特定操作所需的平均时间。 时间是在 2 台机器上测量的:我的本地 Ubuntu 虚拟机和远程服务器。使用 std::queue,两
常规 std::vector 有 emplace_back 避免不必要的复制。 spsc_queue 不支持这个有什么原因吗?是否由于某种原因无法使用无锁队列emplace? 最佳答案 我既不是 bo
我在看 Boost's lockfree queue . 当生产者线程将数据结构 T 插入缓冲区时,它会(通过复制构造函数)将数据复制到缓冲区中。 当消费者线程尝试调用consume_one() 来读
我有一个线程在 boost::lockfree::spsc_queue 上生成数据,以及一个线程消耗数据。我可以让第三个线程使用 read_available 监视队列吗?或 write_availa
考虑以下代码 struct foo { foo() { size_t someCalculatedValue = 2; bar.resize(someC
我正在使用 boost::lockfree::queue Foo(128)。 在弹出队列之前,我可以通过 Foo.empty() 函数检查队列的空状态。 我想知道我是否可以在推送之前以类似的方式检查其
所以我用boost::lockfree::queue写了一个多线程程序,代码和给定的例子差不多 http://www.boost.org/doc/libs/1_62_0/doc/html/lockfr
这里的问题是,boost::lockfree::queue 在分配内存后不会释放内存。为什么 freelist 节点没有返回给操作系统?调用单个集合对象的析构函数。 我想解决内存问题,关于无锁队列内存
我是一名优秀的程序员,十分优秀!