【发布时间】:2010-12-29 07:26:22
【问题描述】:
我实现了一个高性能线程安全组件,不使用 lock 语句,出于性能原因仅使用 volatile 和 Interlocked。
我在一个包含线程安全实例的类中有 volatile 引用类型成员。 此实例仅对几个操作是线程安全的,而对另一个则不是。 因此,出于性能原因,在某些情况下,我更喜欢创建新实例而不是更新原始实例,而且它确实工作得更快,尤其是因为我不使用任何锁定语句。
因此 volatile 成员可以随时替换为另一个实例,volatile 关键字确保在多线程环境中不会出现任何问题。
这当然工作得很好,但唯一的问题是旧实例的垃圾收集。在测试我的组件的性能时,我发现它在垃圾收集释放实例上花费了太多时间。
现在我正在寻找一种方法来回收旧实例。问题是我不能在替换时只使用旧实例并重置它的状态,因为可能有另一个线程仍在使用这个实例,我找不到一种方法(没有锁)来保证没有人使用这个实例没有了。
我如何保证没有线程使用没有锁语句的旧实例? (volatile 和 Interlocked 是首选)
谢谢。
【问题讨论】:
-
使用锁真的会显着降低性能吗?
-
我真的很喜欢“确定”这个词,一定要记住那个词。
-
如果您需要对内存管理进行精细控制,托管应用程序可能不是正确的选择。你在做什么锁定是性能损失?
-
@ironic:使用锁时,您失去了多线程最重要的优势之一,因为尽管有线程,但所有请求都是同步处理的,就像您只使用一个线程一样。在我对双核机器的测试中,我发现不使用锁对我的组件来说速度要快 10 倍。 GC 是我想通过的下一个瓶颈,以实现全效率并支持 C# 中接近实时的应用程序。
-
“当使用锁时……所有请求都是同步处理的” -> 你在做/理解错了。
标签: c# .net multithreading volatile recycle