什么时候线程安全是一个问题?
本文关键字:一个 问题 线程 安全 什么时候 | 更新日期: 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
}