在编写满足无锁进度保证的算法或数据结构时,动态内存分配是一个困难之处:调用类似于
然而,除非你特别限制数据结构或算法为预分配的静态内存池,否则我仍然不理解如何实际上完全满足无锁进度保证。但如果您需要动态内存分配,我不明白任何所谓的无锁内存分配器如何在长期内真正做到无锁。问题在于,无论你的无锁
除非您使用像MS-DOS这样不提供内存保护的古老操作系统,或者编写自己完全无锁的操作系统-这两种情况都不实际或不可能,否则没有任何绕过这个问题的方法。那么,任何动态内存分配器真正能做到无锁吗?
malloc
或new
的函数不能以可移植的方式保证无锁。但是,许多malloc
或new
的无锁实现存在,并且还有各种无锁内存分配器可用于实现无锁算法/数据结构。然而,除非你特别限制数据结构或算法为预分配的静态内存池,否则我仍然不理解如何实际上完全满足无锁进度保证。但如果您需要动态内存分配,我不明白任何所谓的无锁内存分配器如何在长期内真正做到无锁。问题在于,无论你的无锁
malloc
或new
有多么神奇,最终您可能会用完内存,在这种情况下,您必须回退并向操作系统请求更多内存。这意味着,最终您必须调用brk()
或mmap()
或某种低级等效函数才能实际访问更多内存。而且,没有任何保证这些低级调用中的任何一个都以无锁方式实现。除非您使用像MS-DOS这样不提供内存保护的古老操作系统,或者编写自己完全无锁的操作系统-这两种情况都不实际或不可能,否则没有任何绕过这个问题的方法。那么,任何动态内存分配器真正能做到无锁吗?
sbrk()
或其他函数的调用总数可以严格限制到无关紧要的程度。当然,这并不能满足硬实时要求,但我认为即使完全无锁的动态分配也无法满足这样的要求。 - Matt Timmermans