Przeglądam kod napisany przez konsultanta i chociaż pojawiły się już dziesiątki czerwonych flag, nie mogę otoczyć głowy następującym fragmentem:
private void foo()
{
if (InvokeRequired)
{
lock (new object())
{
if (m_bar!= null)
Invoke(new fooDelegate(foo), new object[] { });
}
}
else
{
if(OnBazChanged != null)
OnBazChanged();
}
}
Co tu robi lock (new object ())? Nie powinno mieć żadnego efektu, ponieważ zawsze blokuje inny obiekt, ale ten rodzaj blokowania jest trwały w całym kodzie, nawet w częściach, które nie są kopiowane i wklejane. Czy jest to jakiś szczególny przypadek w języku C #, który jest skompilowany do czegoś, o czym nie wiem, czy też programista po prostu przyjął jakiś kult cargo, który działał jakiś czas temu?
c#
thread-safety
locking
Charles
źródło
źródło
new object()
był przechowywany w polu, a to pole było używane wlock()
wyciągach, i nie wiedzieli lepiej, aby go nie wstawiać.lock
kod jest całkowicie bezużytecznyOdpowiedzi:
Nie zdziwiłbym się, gdyby to był ktoś, kto to widział:
private readonly object lockObj = new object(); private void MyMethod() { lock(lockObj) { // do amazing stuff, so amazing it can only run once at a time // e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ?? } }
i pomyślał, że mógłby zmniejszyć liczbę linii.
Byłbym bardzo zmartwiony, gdyby tak było ...
źródło
Oto podobne pytanie i odpowiedź:
źródło
Prawdopodobnie jest bezużyteczna. Ale istnieje szansa, że stworzy barierę pamięci. Nie jestem pewien, czy C # wykonuje blokadę lub czy robi, czy zachowuje porządkowanie semantyki blokady.
źródło