在c#中有没有一种方法可以将代码标记为非线程安全的?

本文关键字:记为 代码 线程 安全 有没有 方法 一种 | 更新日期: 2023-09-27 18:15:59

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

是否有一些关键字来指示运行时抛出异常,只要一个函数在并行执行?我知道我有时会得到一个异常,当另一个线程修改一个集合,我枚举,但像这样的保障足够依赖吗?

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

在c#中有没有一种方法可以将代码标记为非线程安全的?

您可以使用Monitor。try for this:

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.
}