Минутка WTF-18: We're all doomed
От: Sinix  
Дата: 27.02.17 19:49
Оценка: 111 (5)
Обещанный to be continued
Автор: samius
Дата: 24.02.17
:

        private static readonly SpinLock _lock = new SpinLock();

        private static int _value = 0;

        private static void Increment()
        {
            bool ok = false;
            try
            {
                _lock.Enter(ref ok);

                _value++;

                // ...
            }
            finally
            {
                if (_lock.IsHeld)
                    _lock.Exit(true);
            }
        }

        static void Main(string[] args)
        {
            Parallel.For(0, 100000, i => Increment());
            Console.WriteLine($"Actual: {_value};");

            Console.WriteLine("Done.");
            Console.ReadKey();
        }


Что не так-то?
минутка wtf
Re: Минутка WTF-18: We're all doomed
От: StatujaLeha на правах ИМХО
Дата: 27.02.17 20:56
Оценка: 75 (2) +1
Здравствуйте, Sinix, Вы писали:

private static readonly SpinLock _lock = new SpinLock();

Resharper подсвечивает: "Impure method is called for readonly field of value type".

Если readonly есть, то доступ к переменной _lock внутри Increment() идет через ldsfld(кладет на стек значение статического поля, все Increment работают со своим SpinLock).
Если readonly нет, то доступ к переменной _lock внутри Increment() идет через ldsflda(кладет на стек адрес статического поля, все Increment работают с одним SpinLock).
Re[2]: Минутка WTF-18: We're all doomed
От: Sinix  
Дата: 27.02.17 21:11
Оценка:
Здравствуйте, StatujaLeha, Вы писали:

SL>Resharper подсвечивает: "Impure method is called for readonly field of value type".

Спойлеры же


SL>все Increment работают со своим SpinLock

Не совсем так, всё ещё эпичней. Попробуйте убрать соломку от Thread.Abort(), закомментировав if (_lock.IsHeld).

По теме — та же самая ошибка, что с ImmutableArray<T>. Попытка запихнуть в public API тип с нелогичным поведением ни к чему хорошему не приводит.
Re: Readonly
От: Qbit86 Кипр
Дата: 27.02.17 21:20
Оценка: +2
Здравствуйте, Sinix, Вы писали:

S>
private static readonly SpinLock _lock = new SpinLock();

S>Что не так-то?

Не похожее ли было у Джона Скита (Jon Skeet): micro-optimization-the-surprising-inefficiency-of-readonly-fields
Глаза у меня добрые, но рубашка — смирительная!
Отредактировано 27.02.2017 21:21 Qbit86 . Предыдущая версия .
c#
Re[3]: Минутка WTF-18: We're all doomed
От: StatujaLeha на правах ИМХО
Дата: 27.02.17 21:31
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Не совсем так, всё ещё эпичней. Попробуйте убрать соломку от Thread.Abort(), закомментировав if (_lock.IsHeld).


Cool.
Если соломку заменить на if (ok), то оказывается, что это не соломка :D
Чем в данном примере if (ok) отличается от if (_lock.IsHeld)?
Re[4]: Минутка WTF-18: We're all doomed
От: Sinix  
Дата: 27.02.17 21:36
Оценка: 12 (1)
Здравствуйте, StatujaLeha, Вы писали:

SL>Cool.

SL>Если соломку заменить на if (ok), то оказывается, что это не соломка :D
SL>Чем в данном примере if (ok) отличается от if (_lock.IsHeld)?

да ничем, if (ok) — та же соломка, только аккуратнее. В смысле, с if (ok) оно хоть исключение бросать будет.
Re[2]: Readonly
От: Sinix  
Дата: 27.02.17 21:41
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Не похожее ли было у Джона Скита (Jon Skeet): surprising-inefficiency-of-readonly-fields

Угу, было
Автор: Sinix
Дата: 23.04.16
.

Тут тоже, конечно, surprising, только не совсем inefficiency. Даж наоборот. Итоговая сумма меньше => экономия налицо
Re: Минутка WTF-18: We're all doomed
От: hardcase Пират http://nemerle.org
Дата: 27.02.17 22:24
Оценка: +1 :)
Здравствуйте, Sinix, Вы писали:

S>Обещанный to be continued
Автор: samius
Дата: 24.02.17
:


Пффф. Я на эти грабли IRL наступил
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Минутка WTF-18: We're all doomed
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.02.17 03:37
Оценка: 40 (1)
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, StatujaLeha, Вы писали:


SL>>Cool.

SL>>Если соломку заменить на if (ok), то оказывается, что это не соломка :D
SL>>Чем в данном примере if (ok) отличается от if (_lock.IsHeld)?

S>да ничем, if (ok) — та же соломка, только аккуратнее. В смысле, с if (ok) оно хоть исключение бросать будет.

IsHeld там вообще не по делу, может привести еще и к поломке SpinLock при избыточном вызове Exit.
Re[2]: Минутка WTF-18: We're all doomed
От: Sinix  
Дата: 28.02.17 05:28
Оценка:
Здравствуйте, hardcase, Вы писали:

S>>Обещанный to be continued
Автор: samius
Дата: 24.02.17
:


H>Пффф. Я на эти грабли IRL наступил


Тож Почти все посты этой серии — только из реального кода. Если не считать позаимствованных конечно, в них я авторство указываю. Иначе какой тут WTF-то?
Re[6]: Минутка WTF-18: We're all doomed
От: Sinix  
Дата: 28.02.17 05:33
Оценка:
Здравствуйте, samius, Вы писали:

S>IsHeld там вообще не по делу, может привести еще и к поломке SpinLock при избыточном вызове Exit.




По памяти восстанавливал, накосячил. Там наверно IsHeldByCurrentThread был.
Re[7]: Минутка WTF-18: We're all doomed
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.02.17 05:56
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, samius, Вы писали:


S>По памяти восстанавливал, накосячил. Там наверно IsHeldByCurrentThread был.

А я подумал, что это часть засады WTF.
IsHeldByCurrentThread просит еще и enableThreadOwnerTracking в конструкторе.

Все равно, не дешевле ли ok проверить, особенно на Exit, вызванном в том же методе, где и Enter? Ладно бы еще в разных методах, куда лениво bool тащить.
Re[8]: Минутка WTF-18: We're all doomed
От: Sinix  
Дата: 28.02.17 05:59
Оценка: +1
Здравствуйте, samius, Вы писали:

S>Все равно, не дешевле ли ok проверить, особенно на Exit, вызванном в том же методе, где и Enter? Ладно бы еще в разных методах, куда лениво bool тащить.

+1
Ну вот такой вот код достался
Впрочем, не факт, что я бы сходу лучше написал. Если конечно меня бы кто убедил, что тут нужен именно SpinLock.
Re[9]: Минутка WTF-18: We're all doomed
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.02.17 06:08
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Впрочем, не факт, что я бы сходу лучше написал. Если конечно меня бы кто убедил, что тут нужен именно SpinLock.

Сам давно его стороной обхожу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.