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)
问题是读取后跟读取可能会重新排序(即使使用"volatile").你需要调用Thread.MemoryBarrier(); 在四个"while(_isLockedX)"循环前面.
请阅读http://www.albahari.com/threading/part4.aspx以获取有关内存屏障和易失性的说明.
对于任何真正的项目,请更喜欢现有的锁实现,而不是尝试自己创建.