gpt4 book ai didi

c# - 有没有办法在 C# 中将代码标记为非线程安全?

转载 作者:行者123 更新时间:2023-12-03 12:49:32 24 4
gpt4 key购买 nike

我正在尝试寻找竞争条件,并且遇到了很多可疑的函数。它们中的大多数不允许同时从两个线程调用,但很难确保它们不允许。

是否有一些关键字指示运行时在函数并行执行时立即抛出异常?我知道当另一个线程修改我正在枚举的集合时,有时会出现异常,但是这样的保护措施是否足以依赖?

运行时可以使用lock指令停止执行,因此我需要的只是一个抛出错误的lock

最佳答案

您可以使用Monitor.TryEnter为此:

bool entered = !Monitor.TryEnter(someLockObject);
try
{
if (!entered)
throw Exception("Multi-thread call!");

// Actual code
}
finally
{
if (entered)
{
Monitor.Exit(someLockObject);
}
}

最好将该代码包装在自己的类中:

public sealed class MultiThreadProtector : IDisposable
{
private object syncRoot;

public MultiThreadProtector(object syncRoot)
{
this.syncRoot = syncRoot;

if (!Monitor.TryEnter(syncRoot))
{
throw new Exception("Failure!");
}
}

public void Dispose()
{
Monitor.Exit(this.syncRoot);
}
}

这样你就可以执行如下:

using (new MultiThreadProtector(someLockObject))
{
// protected code.
}

关于c# - 有没有办法在 C# 中将代码标记为非线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16800365/

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