如果有足够的内存,只有一个专用的编写器线程就不需要锁定了吗?

时间:2016-06-23 05:53:05

标签: multithreading locking mutex atomic lockless

对于具有多个读取器线程和单个写入器线程的场景,允许读者读取稍微过时的数据,我已经编写了一个无锁控制流,如下面以伪代码的最基本形式所示:

GLOBAL_ATOMIC_POINTER shared_pointer

// Only called by the reader threads.
read()
    THREAD_LOCAL_POINTER read_pointer := shared_pointer
    return read_data_at(read_pointer)

// Only called by the writer thread.
write(input)
    THREAD_LOCAL_ARRAY array
    THREAD_LOCAL_POINTER write_pointer := shared_pointer
    if write_pointer == location_of_last_element(array)
        write_pointer := location_of_first_element(array)
    else
        write_pointer := location_of_next_element(array, write_pointer)
    write_data_at(write_pointer, input)
    shared_pointer := write_pointer

让我们拨打MAX_READING_DURATION拨打read()的最长时间可以完成,MIN_WRITING_DURATION拨打{write()的最短时间1}}可以完成。

现在,shared_pointer保证是原子的,只要MAX_READING_DURATION < ELEMENT_COUNT(ARRAY) * MIN_WRITING_DURATION,这个方案应该是完全安全的。

或者我忽略了什么?如果没有,我确定这是一个众所周知的事情,并且我想知道正确的术语,所以当我解释/提倡这种方法时,我可以使用它其他

1 个答案:

答案 0 :(得分:1)

足够的内存和写入线程的总数不是 标准,用于确定什么能够和无法锁定。

无锁编程的一个重要特性是,如果挂起单个线程,它将永远不会阻止其他线程通过自己的无锁操作取得进展。

但是,更重要的是:您的(单一作者)代码为了无锁而需要遵守的主要特征是顺序一致性&#39;:

顺序一致性意味着所有线程都同意内存操作发生的顺序,并且该顺序与程序源代码中的操作顺序一致&#39;。

如果代码不能保证顺序一致性,则必须防止内存重新排序。 (以下是有关内存重新排序的更多信息:http://preshing.com/20120515/memory-reordering-caught-in-the-act/

最后,我建议查看这些资源,深入研究无锁多线程编程概念: http://concurrencykit.org/presentations/lockfree_introduction/#/ http://www.drdobbs.com/lock-free-data-structures/184401865

祝你好运!