lock-free

    1热度

    3回答

    我一直在读的书叫多处理器编程的艺术和跨职能来到如get()方法,getandset(),compareandset(),getandIncrease(),getandIncrease()等 在它说,这本书上述所有函数都是原子的,我同意,但是我对自己的一些函数如何变成原子函数有了自己的疑问。 为什么与功能得到或比较成为原子? - 因为它必须等到它达到价值或等待,直到某些条件成为真实,从而产生障碍,因

    2热度

    1回答

    比方说,我有1个计数器从值2开始,一些非原子布尔变量和4个线程。 //Initialization (happens before any thread execute). std::atomic<int> count = ATOMIC_VAR_INIT(2); bool someBoolean = false; 线程1: count.fetch_sub(1, std::memory_or

    6热度

    1回答

    下面我有两个版本的自旋锁。第一个使用默认的memory_order_cst,而后者使用memory_order_acquire/memory_order_release。由于后者更加宽松,我期望它有更好的表现。但似乎并非如此。 class SimpleSpinLock { public: inline SimpleSpinLock(): mFlag(ATOMIC_FLAG_INIT

    1热度

    1回答

    我正在尝试为将在多个平台上支持的应用程序使用Boost :: lockfree :: spsc_queue。我在Windows 7上使用各种版本的Visual Studio,从boost_1_55_0/libs/examples/lockfree中尝试了spsc_queue.cpp示例,它们都正常工作。它在CentOS 6.3上运行得很好(在VMWare Player 6.0下运行)。但在Cent

    9热度

    3回答

    我明白了ABA问题。但我无法理解的是:他们说在自动垃圾回收的语言中,它可能不会显示。所以我的问题是: 自动垃圾收集如何防止发生ABA问题? 在java中可能,如果是的话,怎么样? 是否有可能防止这种情况发生?

    1热度

    2回答

    我试图根据this发布来扩展Java中的无锁队列的实现。 对于我的实现,我仅限于使用原子变量/引用。 另外,我的队列应该有一个最大尺寸。 因此,putObject()应该在队列满时阻塞,如果队列为空,则应该阻塞getObject()。 目前我不知道如何解决这个问题,而不使用锁。 例如,当使用AtomicInteger时,修改操作将是原子操作。 但是仍然存在一个问题,我必须处理putObject()

    0热度

    1回答

    我写了一个Java lock free queue实现。它有一个并发错误。我找不到它。这段代码并不重要。我只是担心我无法解释与挥发性变量相关的观察行为。 该错误是由异常(“空头”)可见的。这是不可能的状态,因为存在保持当前队列大小的原子整数。队列中有一个存根元素。它规定读者线程不会改变尾部指针,并且编写器线程不会改变头部指针。 队列长度变量保证链表永远不会为空。这是一个信号量。 take方法的行为

    5热度

    2回答

    我已经在C++ 11中使用新的std::atomic生成了一个无锁(lockfree)队列的简单实现。我看不出我在这里做错了什么。 #include <atomic> template<typename T> class lockless_queue { public: template<typename DataType> struct node {

    4热度

    2回答

    我的理解是,如果存在大量争用,锁定空闲结构会更好,并且锁定数据结构在低争用情况下效果更好。 为了测试,我写了下面的代码: #include<thread> #include<chrono> #include<iostream> #include<vector> #include<stack> #include<mutex> #include<fstream> #include <bo

    2热度

    1回答

    在一些论坛和书籍(即 C++并发行动)还有多生产者/多消费者堆的一个很好的例子,在流行实现他们通常做到以下几点: // head is an std::atomic<node*> variable node *old_head = head.load(); while(old_head && !head.compare_exchange_weak(old_head, old_head->ne