在C#中实现同步算法

DxC*_*xCK 3 .net c# 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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 6

问题是读取后跟读取可能会重新排序(即使使用"volatile").你需要调用Thread.MemoryBarrier(); 在四个"while(_isLockedX)"循环前面.

请阅读http://www.albahari.com/threading/part4.aspx以获取有关内存屏障和易失性的说明.

对于任何真正的项目,请更喜欢现有的锁实现,而不是尝试自己创建.


Han*_*ant 5

您正在尝试实施Dekker的算法.不幸的是,当硬件设计师和软件工程师仍然相互交谈时,他生活在更简单的时代.PC业务供应商之间的激烈竞争,强调速度和核心,对Dekker先生的聪明才智造成了厄运.有点高兴,我必须已经对该算法进行了数十次审查,并且从未头疼过.

嗯,这有点儿.查看该Wikipedia文章中的"注释",了解该算法不再适用的原因.你有很多可供选择的替代方案.关键的一点是,你发现的关于5年以上并发性的文献不再具有相关性.