lock-free

    1热度

    2回答

    标题几乎传达的所有相关信息,但这里有一个最小的摄制: #include <atomic> #include <cstdio> #include <memory> int main() { auto ptr = std::make_shared<int>(0); bool is_lockless = std::atomic_is_lock_free(&ptr);

    1热度

    1回答

    我试图实现一个无锁栈以便与有界的普通c数组中的外部托管内存一起使用。我知道参考实现(例如来自Anthony Williams:Action中的Concurrency)以及其他书籍和博客/文章。 该实现遵循这些引用并避免ABA问题,因为外部存储器位置使用唯一索引而不是回收指针寻址。因此它根本不需要处理成员管理,而且很简单。 我写了一些测试,在高负载和争用(压力测试)和单线程下在该堆栈上执行弹出和推送

    8热度

    1回答

    在试图理解如何处理无锁定代码的过程中,我试图编写单个消费者/单个生产者锁定空闲队列。与往常一样,我检查了论文,文章和代码,特别是考虑到这是一个有点微妙的话题。 所以,我在此数据结构中的愚蠢库的实现,它可以在这里找到迷迷糊糊: https://github.com/facebook/folly/blob/master/folly/ProducerConsumerQueue.h 当我看到每一个无锁队列

    1热度

    1回答

    我有一个内含fetch_and_store操作的算法。除了这一行,我全面理解算法:pred : ^qnode := I->prev := fetch_and_store (L, I)。这是CLH算法(用于并发编程)。有人可以帮助我理解这一部分。 算法:http://www.cs.rochester.edu/research/synchronization/pseudocode/ss.html#cl

    0热度

    1回答

    我的CPU是Corei7(4个物理内核/ 8个逻辑)。我正在测试自由锁队列的实现。什么是测试?我只是创建了很多线程(“推动者”和“波普尔”),他们推/流行元素。我注意到,当CPU加载时,它工作得更快。所以,当CPU没有相对加载时,它的工作速度会比较慢(相对较多)。而且,它在加载时工作得更快。 如何理解它?我认为这是因为“popper”和“pusher”必须与“head /”tail“竞争(我的意思

    1热度

    1回答

    我有一个使用boost::lockfree::queue(来自升压1.57)一个单线程应用。 (我使用的是队列的原因是,它是也是在多线程应用程序使用的库的一部分。) 看来,队列慢慢地丧失元素。 使用该队列中的类的行为如下: 有一些队列上调用push两个单独的功能。没有超出队列本身提供的线程安全逻辑。 有一个功能,消耗从队列中的元素;它使用while(my_queue.pop(temp_elemen

    1热度

    1回答

    我试图在无锁编程中找到我的脚。在阅读了对内存排序语义的不同解释后,我想澄清可能发生的重新排序。就我所知,指令可以由编译器重新排序(由于程序编译时的优化)和CPU(在运行时?)。 对于松弛语义cpp reference提供了以下示例: // Thread 1: r1 = y.load(memory_order_relaxed); // A x.store(r1, memory_order_rel

    1热度

    1回答

    我试图使用标记的指针来处理列表中的锁定释放操作,以阻止比较和交换(CAS)通过,如果其他线程操作在这次交易中列出。我的节点结构和CAS是这样的: struct node { unsigned long key; unsigned long val; struct node * next; }; static inline bool CAS(std::atomic

    2热度

    2回答

    当涉及到无锁定/等待释放数据结构的算法时,有些算法会从指针中窃取2个最低有效位,因为它们未被使用,并将它们用作状态位(比如如果一个节点被逻辑删除或者什么的话)。我想,在Java中,我只是使用AtomicStampedReference而不是位盗取。但是,我意识到在java中解决ABA问题的唯一方法是使用AtomicStampedReference来跟踪节点是否被更改。 注意:如果傻冒不清楚ABA问

    0热度

    1回答

    我的程序的每个线程都有自己的日志文件。在我的SIGHUP处理程序中,我想通知那些线程,当新的日志消息到达时,他们需要重新打开它们的日志文件。 我想要一个基于标志和计数器的无锁解决方案。 (我有一个线程本地上下文结构用于其他目的,所以我可以在那里添加新的字段)。 如果只是一个记录线程,我会做: static int need_reopen = 0; void sighancont(int sig