c# - volatile 是避免 C# 中竞争条件的好做法吗?

标签 c# .net multithreading thread-safety

我想知道在像这样的特定情况下,我们是否有指示某些服务是否可用的 bool 标志:

    private bool isAvailable;
    private void foo()
    {
        if(isAvailable)
        {
            isAvailable = false;
            DoSomething();
            isAvailable = true;
        }
    }

在多线程环境中将 bool 字段设置为 volatile 是否足够,还是使用锁甚至 Monitor 更好。

在这种特定情况下,如果该服务目前不可用,则无需等待它再次可用。

最佳答案

不,这还不够。 volatile 不足以管理多线程,实际上,volatile 可能会增加预期结果与实际结果之间的差距。访问变量 (isAvailable) 并修改它仍然会导致竞争条件。 您可以使用锁、信号量或原子操作来管理多线程操作。

private object myLock = new object;
private void foo()
{
    lock(myLock)
    {
        DoSomething();
    }
}

[MethodImpl(MethodImplOptions.Synchronized)]
private void foo()
{
    // DoSomething
}

@Fildor 是对的。我想念问题的概念,因此,我编辑了我的答案。下面的代码,如果资源没有被锁定,代码锁定资源并做一些事情,否则它跳过临界区。

private object myLock = new object;
private void foo()
{
    if (Monitor.TryEnter(lockObject))
    {
        try
        {
            //do something
        }
        finally
        {
            Monitor.Exit(lockObject);
        }
    }
}

关于c# - volatile 是避免 C# 中竞争条件的好做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49650747/

相关文章:

C# - 在键入值时刷新文本框

c# - 对于需要引用其他类的类,C# 中的良好设计模式是什么?

android - 在 AsyncTask 中启动 Activity 时内存泄漏(由 Thread 更改)

c++ - boost::asio::io_service 是否保留处理程序的顺序?

java - 如何设置 ScheduledExecutorService 在用户退出程序时结束?

c# - Azure Function 函数如何使用托管标识获取对 Azure 表存储的引用?

c# - 将 Parallel.ForEach() 转换为扩展方法

C# COM 字符串在 C++ BSTR 中损坏

c# - 为什么默认 == 实现不调用 Equals?

asp.net - 将列添加到新的 DataRow