2009-03-18 7 views

Odpowiedz

6

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.

+0

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

+0

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

1

Mam na plecach Joela Coehoorna, łatwo będzie "sfałszować" takie roszczenia.

Dlaczego nie dodać tekst threadsafe w opisie funkcji

+0

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. –

+2

Ale jeśli atrybut jest niepoprawny, prawdopodobnie dokumentacja (jeśli jest) jest równie niepoprawna. –

+0

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. –

-1

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(); 
} 
+0

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. –

+0

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." –

1

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.

1

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