lock-free

    2热度

    1回答

    以下是方案。鲍勃是一位作家,爱丽丝是一位读者。鲍勃写东西,艾丽斯读它们。规则是: 1)Bob可以写出Alice是否正在读取(读取不阻止写入)。 2)当鲍勃写信时,艾丽斯无法读取(写入块读取)。 3)当Alice完成阅读时,她可以知道Bob在她的阅读过程中是否写过(读者可以检测到他们刚才阅读的数据是否无效)。 2)和3)实际上是一个组合规则,但我列出了两个好的讨论。这个问题可以通过一个互斥体和一个计

    23热度

    1回答

    直到现在我在我的项目中使用std::queue。我测量了此队列上特定操作所需的平均时间。 时间是在2台机器上测得的:我的本地Ubuntu VM和远程服务器。 使用std::queue,两台机器的平均值几乎相同:〜750微秒。 然后,我将std::queue“升级”为boost::lockfree::spsc_queue,这样我就可以摆脱保护队列的互斥锁。在我的本地虚拟机上,我可以看到巨大的性能增益

    6热度

    2回答

    我在crossbeam中遇到了回收内存的问题。假设你正在实现一个简单的线程安全的无锁容器,它只保存一个值。任何线程都可以获得存储值的克隆,并且可以随时更新值,然后读者开始观察新值的克隆。 虽然典型的用例是指定像Arc<X>为T,执行不能依靠T为指针大小 - 例如,X可能是一个特点,导致脂肪指针Arc<X>。但是,无锁地访问任意T似乎非常适合于epoch-based lock-free code。基

    1热度

    1回答

    满足无锁进程保证的编写算法或数据结构的困难之一是动态内存分配:调用类似malloc或new的调用不保证以便携方式无锁。然而,存在许多无锁实现malloc或new,并且还有各种可用于实现无锁算法/数据结构的无锁内存分配器。 但是,我仍然不明白如何实际上完全满足无锁进度保证,除非你特别限制你的数据结构或算法到一些预先分配的静态内存池。但是,如果你需要动态内存分配,我不明白如何任何指称的无锁内存分配器永

    -1热度

    1回答

    在安东尼·威廉姆斯在行动书并发,他实现了采用分体式引用计数锁免费栈。在头节点的初始加载之后。在这里他使用下面代码中列出的方法调用increase_head_count。 counted_node_ptr old_head = head.load(); increase_head_count(old_head); void increase_head_count(counted_node_pt

    1热度

    1回答

    “Treiber Stack”通常是最简单的无锁数据结构之一,因此在教授无锁算法介绍时经常使用它。 我见过很多使用C++ atomics的Treiber Stacks的实现。算法本身是微不足道的,所以真正的挑战是处理无锁数据结构的所有其他附带细节,例如提供某种方式来执行安全的内存回收,避免ABA问题,并以无锁方式分配节点。这可以通过各种方式解决,例如使用原子引用计数,危险指针,计数/标记指针以避免

    0热度

    1回答

    我有以下函数updateEntry它将值写入查找表。我想创建这个函数的多线程版本。 我正在研究原子操作__sync_bool_compare_and_swap,但我不知道如何在这里正确应用它。 是否理论上可以在没有锁定的情况下自动实现此功能,因为它会更改两个独立的存储位置entryLookup[id]和entry? void updateEntry(Entry ** entryLookup, un

    1热度

    2回答

    所以锁定自由是当你有保证整个系统进展,虽然有些线程可能会饿死。所以基于CAS的实现将提供这种保证。 然后无阻塞是当一个线程保证完成,如果所有其他线程都挂起。 你能给出一个简单的无锁定算法的例子吗? 谢谢!

    3热度

    1回答

    我在C++中发现了一个奇怪的行为,std::shared_ptr。 以下示例完美适用于标准指针。 但std::shared_ptr的使用导致此处出现分段故障。 (请参阅下面的回溯) 我知道,从多个线程访问std::shared_ptr并不安全,因此我正在使用原子操作。即使是经典的锁也不会解决问题。 进出口使用gcc version 6.3.0 20170406 (Ubuntu 6.3.0-12ub

    0热度

    1回答

    从回答我刚才的问题: Pointers in c++ after delete 它变得清晰,即使用指针的值,即点“删除”记忆(尤其是将它们复制)导致在C++ 11中的undef行为和在C++ 14中的实现定义的行为。 Antomy威廉姆斯在他的著作“C++在行动并发”建议用引用计数的下一个无锁堆栈: #include <atomic> #include <memory> template<t