Является ли секундомер .ElapsedTicks потокобезопасным?

Если у меня есть общий экземпляр System.Diagnostics.Stopwatch, можно ли несколько потоков вызвать shared.ElapsedTicks безопасным образом и получить точные результаты?

Существует ли какая-либо разница в отношении безопасности потоков/точности между использованием совместно используемого экземпляра секундомера таким образом и использованием статического метода GetTimeStamp()?

Я измеряю интервалы около 180 мс, и выяснение того, что использование общего экземпляра дает мне большее распространение результатов, в том числе значительное число, которое меньше, чем я ожидал.

Машина имеет несколько процессоров (2 * Intel X5550 за то, что она стоит)

Ответ 1

От MSDN: "Любые члены экземпляра не гарантируют безопасность потоков".

Ответ 2

Взглянув на исходный код, он не является потокобезопасным.

Ответ 3

Вы можете использовать https://msdn.microsoft.com/en-us/library/dd642243(v=vs.110).aspx

ThreadLocal<T> 

вот так:

    ThreadLocal<Random> _localRandom = new ThreadLocal<Random>(() => new Random());
    ThreadLocal<Stopwatch> _localStopwatch = new ThreadLocal<Stopwatch>(() => new Stopwatch());

    public void SomeTest()
    {
        Action someAction = () =>
            {
                _localStopwatch.Value.Reset();
                _localStopwatch.Value.Start();
                Thread.Sleep(_localRandom.Value.Next(100, 500));
                _localStopwatch.Value.Stop();
                Debug.Print(_localStopwatch.Value.Elapsed.TotalMilliseconds.ToString(CultureInfo.InvariantCulture));
            };

        var actions = Enumerable.Range(0, 1000).Select(i => someAction).ToArray();
        Parallel.Invoke(new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount}, actions);
    }