c# - 在C#中实现同步算法

标签 c# .net multithreading synchronization thread-safety

我尝试在 C# 中实现同步算法,但没有成功。

为什么下面的代码线程不安全?

using System;
using System.Threading;

namespace SoftwareLockTest
{
    class Program
    {
        private static volatile bool _isLocked1 = false;
        private static volatile bool _isLocked2 = false;
        private static volatile int _count = 0;

        static void Main(string[] args)
        {
            Thread thread2 = new Thread(Thread2Work);
            thread2.Start();

            Thread1Work();
        }

        public static void Thread1Work()
        {
            while (true)
            {
                _isLocked1 = true;

                while (_isLocked2)
                {
                    _isLocked1 = false;
                    while (_isLocked2) ;
                    _isLocked1 = true;
                }

                CriticalSection();
                _isLocked1 = false;
            }
        }

        public static void Thread2Work()
        {
            while (true)
            {
                _isLocked2 = true;

                while (_isLocked1)
                {
                    _isLocked2 = false;
                    while (_isLocked1) ;
                    _isLocked2 = true;
                }

                CriticalSection();
                _isLocked2 = false;
            }
        }

        private static void CriticalSection()
        {
            if (_count != 0)
            {
                Console.WriteLine("NOT THREAD SAFE 1");
                _count = 0;
            }

            _count++;

            if (_count != 1)
            {
                Console.WriteLine("NOT THREAD SAFE 2");
            }

            _count--;

            if (_count != 0)
            {
                Console.WriteLine("NOT THREAD SAFE 3");
            }
        }
    }
}

最佳答案

问题是写入后读取可能会重新排序(即使使用“volatile”)。你需要调用 Thread.MemoryBarrier();在四个“while (_isLockedX)”循环之前。

请阅读http://www.albahari.com/threading/part4.aspx有关内存屏障和 volatile 的解释。

对于任何实际项目,请更喜欢现有的锁实现,而不是尝试自己制作。

关于c# - 在C#中实现同步算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1989475/

相关文章:

c# - 如何在 BeginInvoke 中进行 Thread.Sleep

python - 正确使用 threading.RLock

javascript - 如何通过单击进行多个图像下载

c# - 为什么我无法编译在 C# 的类接口(interface)中声明的自定义事件

.net - Razor RTM 中的声明性辅助方法

c# - 如何判断我的对象的值是 float 还是 int?

c# - 根据用户请求在后台生成文件

c# - 为 main、interface 和 class 创建一个单独的文件

c# - 如何解决多个库中存在的 HttpClient

.net - 如何确保我的整个团队拥有完全相同版本的 .Net 运行时?