private staticreadonly 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).
Здравствуйте, 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 тип с нелогичным поведением ни к чему хорошему не приводит.
Здравствуйте, StatujaLeha, Вы писали:
SL>Cool. SL>Если соломку заменить на if (ok), то оказывается, что это не соломка :D SL>Чем в данном примере if (ok) отличается от if (_lock.IsHeld)?
да ничем, if (ok) — та же соломка, только аккуратнее. В смысле, с if (ok) оно хоть исключение бросать будет.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, StatujaLeha, Вы писали:
SL>>Cool. SL>>Если соломку заменить на if (ok), то оказывается, что это не соломка :D SL>>Чем в данном примере if (ok) отличается от if (_lock.IsHeld)?
S>да ничем, if (ok) — та же соломка, только аккуратнее. В смысле, с if (ok) оно хоть исключение бросать будет.
IsHeld там вообще не по делу, может привести еще и к поломке SpinLock при избыточном вызове Exit.
Тож Почти все посты этой серии — только из реального кода. Если не считать позаимствованных конечно, в них я авторство указываю. Иначе какой тут WTF-то?
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>По памяти восстанавливал, накосячил. Там наверно IsHeldByCurrentThread был.
А я подумал, что это часть засады WTF.
IsHeldByCurrentThread просит еще и enableThreadOwnerTracking в конструкторе.
Все равно, не дешевле ли ok проверить, особенно на Exit, вызванном в том же методе, где и Enter? Ладно бы еще в разных методах, куда лениво bool тащить.
Здравствуйте, samius, Вы писали:
S>Все равно, не дешевле ли ok проверить, особенно на Exit, вызванном в том же методе, где и Enter? Ладно бы еще в разных методах, куда лениво bool тащить.
+1
Ну вот такой вот код достался
Впрочем, не факт, что я бы сходу лучше написал. Если конечно меня бы кто убедил, что тут нужен именно SpinLock.
Здравствуйте, Sinix, Вы писали:
S>Впрочем, не факт, что я бы сходу лучше написал. Если конечно меня бы кто убедил, что тут нужен именно SpinLock.
Сам давно его стороной обхожу.