我刚刚用 C 语言创建了一个 LinkedList,并且我有一个 clear
函数。
clear 函数遍历 LinkedList 并在每个节点上调用 free()
。这意味着它是一个O(n)
函数,非常慢。
我是否应该创建一个 pthread
(或其他我不知道的线程库),为它提供我的 root
节点,设置我的 LinkedList 的 root
节点为 NULL,然后让线程清理内存,同时列表现在准备好立即添加?这样做有危险吗?这意味着用户可以在 LinkedList 中添加更多数据,然后才能有足够的空间来解释它,对吗?它就像一张信用卡,但用于内存。
这样做安全吗?怎样才能为这种情况编写健壮而快速的代码?
最佳答案
当然,如果您使用 pthreads 进行编译,那么 free 应该是线程安全的。
安全吗?使用互斥锁确保访问不受并发编辑的影响。
你应该这样做吗?将线程隐藏在通用容器结构后面被认为是糟糕的架构风格。您的库用户会认为 clear() 是一种可以完成工作的阻塞方法。如果图书馆用户需要异步免费,他可以自己创建一个线程。
清除链表是否必须具有 O(n) 时间复杂度?如果所有内存都在托管的连续 block 中,则并非如此。
关于C - 释放线程中的数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473833/