gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:13:57 24 4
gpt4 key购买 nike

我尝试在 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/

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