gpt4 book ai didi

multithreading - 给定足够的内存,当只有一个专用的写线程时,是否不需要锁?

转载 作者:行者123 更新时间:2023-12-03 13:03:59 25 4
gpt4 key购买 nike

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

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()调用所需的最短时间。

现在,只要 shared_pointer保证是原子的,只要 MAX_READING_DURATION < ELEMENT_COUNT(ARRAY) * MIN_WRITING_DURATION,此方案就应该是绝对安全的。

还是我忽略了什么?如果不是,我确定这是众所周知的事情,并且我想知道正确的术语,因此在向他人解释/提倡这种方法时可以使用该术语。

最佳答案

足够的内存和写入线程的总数不是确定什么可以不锁的标准。

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

但是,更重要的是:(单写程序)代码需要遵循的主要功能才能保持无锁状态:“顺序一致性”:

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

如果代码不能保证顺序一致性,则必须防止内存重新排序。 (这是有关内存重新排序的更多信息: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

祝你好运!

关于multithreading - 给定足够的内存,当只有一个专用的写线程时,是否不需要锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37983331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com