gpt4 book ai didi

c# - 无锁引用计数

转载 作者:太空狗 更新时间:2023-10-29 21:29:21 25 4
gpt4 key购买 nike

我正在开发一个需要大量 C API 互操作的系统。互操作的一部分需要在任何操作之前和之后对相关系统进行初始化和关闭。任何一个都不做都会导致系统不稳定。我通过简单地在核心一次性环境类中实现引用计数来实现这一点,如下所示:

public FooEnvironment()
{
lock(EnvironmentLock)
{
if(_initCount == 0)
{
Init(); // global startup
}
_initCount++;
}
}

private void Dispose(bool disposing)
{
if(_disposed)
return;

if(disposing)
{
lock(EnvironmentLock)
{
_initCount--;
if(_initCount == 0)
{
Term(); // global termination
}
}
}
}

这很好用并且达到了目标。然而,由于任何互操作操作都必须嵌套在 FooEnvironment using block 中,我们一直在锁定,分析表明这种锁定占运行时完成工作的近 50%。在我看来,这是一个足够基本的概念,.NET 或 CLR 中的某些内容必须解决它。有没有更好的方法来进行引用计数?

最佳答案

这是一项比您乍一看可能预想的更棘手的任务。我认为 Interlocked.Increment 不足以完成您的任务。相反,我希望您需要使用 CAS(比较和交换)执行一些魔法。

另请注意,非常容易得到这个 moSTLy-right,但是当您的程序因 heisenbugs 而崩溃时,moSTLy-right 仍然是完全错误的。

我强烈建议在走这条路之前进行一些真正的研究。如果您搜索“Lock free reference counting”,几个很好的起点会跳到顶部。 This Dr. Dobbs article很有用,this SO Question可能是相关的。

最重要的是,请记住无锁编程很难。如果这不是您的专长,请考虑退后一步并围绕引用计数的粒度调整您的期望。如果您不是专家,重新考虑您的基本重新计数策略可能比创建可靠的无锁机制要便宜得多。尤其是当您还不知道无锁技术实际上会更快时。

关于c# - 无锁引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10074030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com