Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定没有锁定的任何其他线程何时不使用对象?_C#_.net_Multithreading_Volatile_Recycle - Fatal编程技术网

C# 确定没有锁定的任何其他线程何时不使用对象?

C# 确定没有锁定的任何其他线程何时不使用对象?,c#,.net,multithreading,volatile,recycle,C#,.net,Multithreading,Volatile,Recycle,我实现了一个高性能的线程安全组件,没有使用lock语句,出于性能原因,只使用volatile和Interlocked语句 我在一个类中有volatile引用类型成员,该类包含线程安全实例。 此实例仅对几个操作是线程安全的,而对另一个操作不是。 因此,出于性能原因,在某些情况下,我更喜欢创建新实例,而不是更新原始实例,而且它的运行速度确实更快,特别是因为我不使用任何lock语句 因此volatile成员可以随时替换到另一个实例,volatile关键字确保在多线程环境中不会出现任何问题 这当然工作得

我实现了一个高性能的线程安全组件,没有使用lock语句,出于性能原因,只使用volatile和Interlocked语句

我在一个类中有volatile引用类型成员,该类包含线程安全实例。 此实例仅对几个操作是线程安全的,而对另一个操作不是。 因此,出于性能原因,在某些情况下,我更喜欢创建新实例,而不是更新原始实例,而且它的运行速度确实更快,特别是因为我不使用任何lock语句

因此volatile成员可以随时替换到另一个实例,volatile关键字确保在多线程环境中不会出现任何问题

这当然工作得很好,但唯一的问题是旧实例的垃圾收集。当测试我的组件的性能时,我发现它在对发布的实例进行垃圾收集上花费了太多的时间

现在我正在寻找一种回收旧实例的方法。问题是,我不能在替换旧实例时只重置它的状态,因为可能还有其他线程仍在使用此实例,我无法找到一种方法(没有锁)来保证不再有人使用此实例

我如何保证没有线程使用没有lock语句的旧实例?(首选易失性和联锁)


谢谢。

问题是,任何线程都可以将对象的引用带到堆栈上,然后根据需要对其执行任何操作。如果不使用整体锁,就无法防止非线程安全操作出现这种情况


一般来说,您不应该尝试使用.NET垃圾收集器-最好找出GCs花费如此长时间的原因,并为此进行优化(首先不要创建这么多实例,可能是一个O(n^2)操作创建了大量实例?)而不是试图以线程安全的方式重用实例。

问题在于,任何线程都可以将对对象的引用带到堆栈上,然后对其执行任意操作。如果不使用整体锁,就无法防止非线程安全操作出现这种情况


一般来说,您不应该尝试使用.NET垃圾收集器-最好找出GCs花费如此长时间的原因,并为此进行优化(首先不要创建这么多实例,可能是一个O(n^2)操作创建了大量实例?)而不是试图以线程安全的方式重复使用实例。

您询问是否存在某些东西,这些东西会告诉您在多线程应用程序中对对象执行操作是否安全。这就是锁的定义。如果使用.NET提供的结构不够快,也许您应该考虑更改为运行速度更快的语言。

您询问是否存在一些可以告诉您在多线程应用程序中对对象进行操作是否安全的问题。这就是锁的定义。如果使用.NET提供的结构不够快,也许你应该考虑转换成一个运行速度更快的语言。

这里你想要实现的东西看起来很像引用计数(记住COM?)。您可能可以通过递增/递减来实现这一点—只需在引用旁边保留一个引用计数器即可

这种技术唯一的问题是它依赖于对象消费者对对象使用的态度。这使得代码非常脆弱


另一个问题是锁的主要性能问题不是锁本身,而是它所暗示的内存障碍。关键是每个访问volatile变量的人都做同样的事情。换句话说,我不认为用易变变量替换锁会获得任何好处

您在这里尝试实现的功能看起来很像引用计数(还记得COM吗?)。您可能可以通过递增/递减来实现这一点—只需在引用旁边保留一个引用计数器即可

这种技术唯一的问题是它依赖于对象消费者对对象使用的态度。这使得代码非常脆弱


另一个问题是锁的主要性能问题不是锁本身,而是它所暗示的内存障碍。关键是每个访问volatile变量的人都做同样的事情。换言之,我不认为用可变变量替换锁会获得任何好处,你可以从死中恢复对象,也就是说,当对象最终确定时,你实际上会使它们再次激活。这样做的好处是,在它们的生命周期的这一点上,不能对它们进行任何引用,否则它们从一开始就不适用于finalize。有关更多详细信息,请参阅本文中的“Ressurection”一章


现在,如果这真的能为您带来任何性能,或者值得这么做,我不知道;-)

你可以从死者身上取下这个物体,也就是说,当你的物体最终定稿时,你实际上让它们再次复活。这样做的好处是,在它们的生命周期的这一点上,不能对它们进行任何引用,否则它们从一开始就不适用于finalize。有关更多详细信息,请参阅本文中的“Ressurection”一章


现在,如果这真的能为您带来任何性能,或者值得这么做,我不知道;-)

使用锁真的会显著降低性能吗?我非常喜欢“determinate”这个词,我必须记住这个词。如果您需要对内存管理进行精细控制,那么托管应用程序可能不是正确的选择。当锁定是性能损失时,你在做什么?@讽刺的是:当使用锁定时,你失去了多线程最重要的优势之一,因为所有请求都是同步处理的,尽管