什么时候线程安全是一个问题?

本文关键字:一个 问题 线程 安全 什么时候 | 更新日期: 2023-09-27 18:03:48

当你实例化类并使用它们的方法来启动线程时,线程安全不是那么重要。

什么时候线程安全是一个问题?

如果多个线程正在访问同一个对象实例,那么您需要添加锁以确保线程安全:

// make sure that this is defined *outside* the method
// so that all threads lock on the same instance
private readonly object _lock = new object();
...
// add a lock inside your event handler
proc.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) =>
{
    if (e.Data != null)
    {
        lock (_lock)
           info.additional += e.Data;
    }
};

作为旁注,如果您正在使用。net 4,您可能想要检查ConcurrentQueue类。这是FIFO缓冲区的线程安全实现,如果多个线程需要同时为它们的项目排队,这可能很有用:

private ConcurrentQueue<SomeInfo> _queue = new ConcurrentQueue<SomeInfo>();
...
proc.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) =>
{
    if (e.Data != null)
    {
        // no need to lock
        _queue.Enqueue(e.Data);
    }
};

要在单独的线程中取消队列,可以使用:

SomeData data = null;
while (_queue.TryDequeue(out data))
{
    // do something with data
}