gpt4 book ai didi

c# - 如何: Write a thread-safe method that may only be called once?

转载 作者:太空狗 更新时间:2023-10-29 19:43:03 24 4
gpt4 key购买 nike

我正在尝试编写一个只能调用一次(每个对象实例)的线程安全方法。如果之前调用过,则应抛出异常。

我想出了两个解决方案。他们都正确吗?如果不是,他们有什么问题?

  1. lock :

    public void Foo()
    {
    lock (fooLock)
    {
    if (fooCalled) throw new InvalidOperationException();
    fooCalled = true;
    }

    }
    private object fooLock = new object();
    private bool fooCalled;
  2. Interlocked.CompareExchange :

    public void Foo()
    {
    if (Interlocked.CompareExchange(ref fooCalled, 1, 0) == 1)
    throw new InvalidOperationException();

    }
    private int fooCalled;

    如果我没记错的话,这个解决方案的优点是无锁(这对我来说似乎无关紧要),而且它需要的私有(private)字段更少。

我也愿意听取应该首选哪种解决方案的合理意见,如果有更好的方法,我也会提出进一步的建议。

最佳答案

您的 Interlocked.CompareExchange 解决方案看起来是最好的,并且(如您所说)是无锁的。它也比其他解决方案复杂得多。锁是相当重量级的,而 CompareExchange 可以编译成单个 CAS cpu 指令。我说去那个吧。

关于c# - 如何: Write a thread-safe method that may only be called once?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9514411/

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