Безопасно ли использовать секундомер в методе, вызываемом несколькими потоками?
У меня есть метод, который выполняет некоторую работу. Я использую System.Diagnostics.Stopwatch в этом методе, чтобы измерить время, необходимое для выполнения задачи, выполняемой этим методом. Этот метод вызывается несколько раз несколькими потоками следующим образом:
ArrayList workerThreads = new ArrayList();
for (int i = 0; i < numThread; i++)
{
Thread workerThread = new Thread(DoWork);
workerThread.IsBackground = true;
workerThreads.Add(workerThread);
}
for (int i = 0; i < numThread; i++)
{
((Thread)workerThreads[i]).Start();
}
public void DoWork()
{
Stopwatch sw = Stopwatch.StartNew();
// Do something
sw.Stop();
Log.Info(sw.ElapsedMilliseconds);
}
Безопасно ли использовать секундомер таким, какой я есть? Будут ли результаты точными или мне нужно будет явно заблокировать их, чтобы потоки не перешагивали значения истекшего времени друг друга?
1 ответ
Решение
There are no thread safety concerns involved, because you are not sharing instance of Stopwatch
через темы.
Теоретически Stopwatch.StartNew
could be thread unsafe, but it is not:
Любые открытые статические (Shared в Visual Basic) члены этого типа являются потокобезопасными.