【发布时间】:2017-02-27 06:07:32
【问题描述】:
我刚刚在 C 中创建了一个 LinkedList,我有一个 clear 函数。
clear 函数遍历 LinkedList 并在每个节点上调用 free()。这意味着它是一个O(n) 函数,非常慢。
我是否应该创建一个pthread(或其他一些我不知道的线程库),提供我的root 节点,将我的LinkedList 的root 节点设置为NULL,然后清理线程现在可以立即添加列表时的内存?这样做有危险吗?这意味着用户可以在有足够的空间来解释之前向 LinkedList 添加更多数据,对吗?它就像一张信用卡,但用于记忆。
这样做安全吗?在这种情况下,如何编写健壮且快速的代码?
【问题讨论】:
-
“……很慢。” - 相比什么?当然,您似乎认为的内存泄漏通常更快。说:不清楚你在问什么。提供包含所有必需信息的minimal reproducible example。
-
链接列表通常表现不佳,而不是因为释放。如果没有基准、参考机器和性能要求,这个问题是无法回答的。
-
在我看来这是清除整个链表的唯一方法。 “将我的 LinkedList 的根节点设置为 NULL,然后让线程清理内存”如果您丢失了
root节点,您如何访问其他节点? -
@Olaf 如果我使用
thread来清除 LinkedList,那么可能正在使用 LinkedList 的主线程...队列不必等待 O(n)手术。意思是,您可以将n元素添加到LinkedList,调用clear(这是O(n))并且您的主线程永远不必循环主列表。它节省了一个额外的循环O(n) -
@Mouin 我会将
rootNode 传递给垃圾清理线程,但在LinkedListstruct中我会将root设置为NULL,这样操作就像insert、@ 987654338@等都会假定LinkedList是空的。
标签: c multithreading data-structures