Является ли Stopwatch.ElapsedTicks потокобезопасным? - PullRequest
8 голосов
/ 12 июля 2011

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 12 июля 2011

С MSDN : «Не гарантируется, что любые члены экземпляра будут поточно-ориентированными».

6 голосов
/ 16 января 2014

Вы можете использовать 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);
    }
5 голосов
/ 12 июля 2011

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

0 голосов
/ 11 апреля 2019

Глядя на исходный код , это поточно-ориентированный, но вы не должны использовать: Stop(), Reset() и Restart().

Итак, если вы запускаете общий экземпляр, не изменяете его и вызываете только ElapsedXXX свойств, у вас все будет хорошо.

...