W .NET skąd mogę wiedzieć, czy klasa lub metoda jest bezpieczne dla wątków, czy nie? Czy domyślnie nie jest bezpieczny dla wątków?Czy istnieje atrybut do oznaczania klasy lub metody, która ma być bezpieczna dla wątków w .NET?
Odpowiedz
To nie jest żadna właściwość: musisz przeczytać dokumentację dla każdego przedmiotu, który cię interesuje. Nie możesz stworzyć nici bezpiecznej, po prostu dodając do niego atrybut. To tak, jakby wziąć pomarańczę i nakleić na niej nalepkę "Apple".
Oczywiście to samo dotyczy serializacji i nie zatrzymało ich tam, ale nadal: brak atrybutu. Przeczytaj dokumenty.
Wszystkie statyczne metody i właściwości są domyślnie bezpieczne wątku domyślnie (tj. Chyba że udokumentowane inaczej), na przykład metod założenia jest to, że nie są. – Richard
Zakładając, że metoda nie jest bezpieczna dla wątków, gdy nie powoduje żadnych szkód, zakładając, że jest ona bezpieczna dla wątków, gdy nie może być nieprzyjemna. Lepiej założyć, że nic nie jest bezpieczne, chyba że jest to wskazane. – JoshBerke
Mam na plecach Joela Coehoorna, łatwo będzie "sfałszować" takie roszczenia.
Dlaczego nie dodać tekst threadsafe w opisie funkcji
Nie martwiłbym się zbytnio o "fałszowanie" tego. Ale współbieżność jest trudna: byłoby bardzo prawdopodobne, że błąd się zepsuł i ten atrybut jest po prostu niepoprawny. –
Ale jeśli atrybut jest niepoprawny, prawdopodobnie dokumentacja (jeśli jest) jest równie niepoprawna. –
Całkowicie zgadzam się z @JimMischel, ale Joel nie był tym, który popierał dokumentację. Przynajmniej atrybuty są odczytywalne maszynowo, co pozwala na co najmniej automatyczne wyliczanie, filtrowanie, raportowanie itp. Przypisanych metod, a nawet potencjalnie nawet słabe formy analizy statycznej i/lub zapobiegania błędom.Atrybuty są do zrobienia, ale potrzebny jest ich rozbudowany i kompletny system do przechwytywania semantyki współbieżności w jakikolwiek naprawdę użyteczny sposób. W przypadku .NET nie jestem świadomy żadnego takiego projektu ani propozycji. –
Nie ma przypadków użycia scenariusz dokonywania klasa zsynchronizowane, o ile metoda dotyczy używać następujących stylu Kodowanie:
using System.Runtime.CompilerServices;
[MethodImpl(MethodImplOptions.Synchronized)]
void MyMethod()
{
DoSomething();
}
Problem jest; to nadal nie oznacza, że metoda jest bezpieczna dla wątków - ponieważ inny wątek mógłby wywoływać inną metodę, która * nie * posiada [MethodImpl], a więc niszcząc się nawzajem. Podobnie, nawet jeśli wszystkie pola są tylko do odczytu, pola obiektów podrzędnych mogą być zmienne i powodować problemy. –
Nawet jeśli ten tak zwany "styl kodowania" * może * oznaczać coś (zobacz wiele innych komentarzy na tej stronie), flaga 'MethodImplOptions.Synchronized' ma przeciwne znaczenie dla tego, czego szuka OP. Ta flaga ma na celu wskazanie, że metoda jest ** nie ** bezpieczna dla wątków. Z dokumentacji: "Metoda może być wykonywana tylko przez jeden wątek na raz." –
To można uzyskać cały dostęp do obiektu seryjnego za pośrednictwem IContributeObjectSink/IContextAttribute
, chociaż będzie to miało wpływ na dużą wydajność, ponieważ będzie wymagać podklasy obiektu MarshalByRefObject
, narzutu tworzenia kontekstu itp.
Nie, a to byłoby bezcelowe.
Załóżmy mam bezpieczną lista wątków, ma trzy wątek Safe ™ metod:
void Add(something);
void Remove(index);
int GetCount();
something GetElementAt(index);
jeden wątek:
for 1 to 100 do
list.Add(12);
Temat dwa i trzy:
while(list.GetCount() >0)
{
list.Remove(0);
}
Powyższy kod ulegnie awarii (prędzej czy później), ponieważ lista może się zmienić między czasem wywołania GetCount
i Remove
W jakim celu chciałbyś, aby taki atrybut służył? – AnthonyWJones
Może być rodzajem dokumentacji kodu, aby ostrzec użytkownika klasy –
Jeśli chce tylko dokumentacji, może umieścić go w sekcji . –