2012-11-13 11 views
10

To może wydawać się trochę szalone, ale jest to podejście, które rozważam jako część większej biblioteki, jeśli mogę być dość pewna, że ​​nie spowoduje dziwnego zachowania.Multipleksowanie asynchronizmu C# 5.0 w puli wątków - czy wątek jest bezpieczny?

Podejście:

Run asynchroniczny kod użytkownika z SynchronizationContext że wysyła dostawcy do puli wątków. Kod użytkownik będzie wyglądać następująco:

async void DoSomething() 
{ 
    int someState = 2; 
    await DoSomethingAsync(); 
    someState = 4; 
    await DoSomethingElseAsync(); 
    // someState guaranteed to be 4? 
} 

nie jestem pewien, czy dostęp do someState byłoby threadsafe. Podczas gdy kod byłby uruchamiany w jednym "wątku", tak, że operacje są w rzeczywistości całkowicie uporządkowane, może być nadal dzielony na wiele wątków pod maską. Jeśli moje zrozumienie jest poprawne, zamawianie powinno być bezpieczne na x86, a ponieważ zmienna nie jest udostępniona, nie będę musiał się martwić o optymalizacje kompilatora i tak dalej.

Co ważniejsze, jestem zaniepokojony, czy będzie to zagwarantowane w sposób bezpieczny dla wątków w modelach pamięci ECMA lub CLR.

Jestem prawie pewien, że będę musiał wstawić barierę pamięci przed wykonaniem kolejki pracy, ale nie jestem całkowicie pewny w moim rozumowaniu tutaj (lub że to podejście może być niemożliwe z całkowicie różnych powodów) .

+5

Jest to zmienna lokalna. Jak nie może być bezpieczny dla wątków? IOW, co sprawia, że ​​myślisz, że można go zmienić w innym wątku? (Chyba że podajesz odniesienie do niego gdzieś, co nie jest pokazane, np. "Ref" lub jako przechwycona zmienna). – leppie

+3

Z tego co rozumiem, 'await' przekształca następujący kod w kontynuację, która jest wykonywana na bieżącym' SynchronizationContext', gdy kończy się podstawowe 'Zadanie'. Jeśli jest to wysyłanie do puli wątków, kontynuacja może działać w innym wątku. Nie uruchomi się * jednocześnie * w żaden sposób, ale nie jestem pewien, czy zmiany w 'jakimś stanie' będą gwarantowane, jeśli kontynuacja będzie wykonywana na innym wątku fizycznym. – ShZ

+2

To jest świetne pytanie, o którym wielu ludzi nawet nie pyta. –

Odpowiedz

9

to odpowiedzieć w komentarzach na async/await FAQ:

OC obejmuje odpowiednie bariery, gdy zadania są ustawiane w kolejce i na początku/końca realizacji zadań tak, że wartości są odpowiednio widoczne.

Nie ma więc żadnych wyraźnych barier.

Powiązane problemy