这段代码中使用Interlocked.Exchange写入的易失性读取值是否存在线程安全问题? [重复]

问题描述 投票:0回答:1
class TaskTracker
{
    private volatile ConcurrentBag<Task> _bag = new();
    
    public async Task WaitAllAvailableAsync()
    {
        await Task.WhenAll(Interlocked.Exchange(ref _bag, new()));
    }

    public void AddTask(Task toWait)
    {
        // should guarantee that the Task will be awaited on at least one WaitAllAvailableAsync call
        ConcurrentBag<Task> oldBag, bag = _bag;
        do
        {
            bag.Add(toWait);
            oldBag = bag;
        } while ((bag = _bag) != oldBag);
    }
}

WaitAllAvailableAsync
在计时器上调用。

这里有线程安全问题吗?是否有任何情况下,添加的任务不会在

WaitAllAvailableAsync
调用中等待至少一次(假设无限运行)?

我知道这个类可以用

ConcurrentQueue
重写。但对于这个问题我想知道所提出的方法的缺陷。

c# multithreading thread-safety lock-free interlocked
1个回答
0
投票

是否有任何情况下添加的任务不会在

WaitAllAvailableAsync
调用至少一次(假设无限运行)内等待?

不,在任何情况下,添加的任务都不会被

WaitAllAvailableAsync
至少等待一次。代码按原样正确执行其预期目的。

© www.soinside.com 2019 - 2024. All rights reserved.