2009-05-28 12 views

Odpowiedz

10

Istnieje Interlocked.Exchange. Robi to w bezpiecznym dla atomów wywołaniu atomowym.


Edit po komentarzach:

Wystarczy, aby wyjaśnić, jak to działa przy użyciu Interlocked.Exchange, zrobiłbyś:

left = Interlocked.Exchange(ref right, left); 

ten będzie równoważny (w efekcie) do robienia:

Swap(ref left, ref right); 

Jednak Interlocked.Exchange robi to jako operację atomową, więc jest bezpieczny dla wątków.

+1

Interlocked.Echange ustawia wartość, w rzeczywistości nie zamienia wartości. Nadal będziesz musiał zapisać temp, i zadzwonić do Interlocked.Exchange dwa razy, więc naprawdę nic nie zyskasz. – jrista

+1

Interlocked.Exchange nie jest tak naprawdę odpowiednikiem określonej zamiany. Zmienia tylko pierwszą wartość i nie dotyka drugiej (samej). –

+1

@Mehdrad: left = InterlockedExchange (ref right, left); –

3

Nie, struktura nie ma takiej metody. Prawdopodobnie powodem jest to, że nie ma wiele korzyści, aby go wbudować i możesz bardzo łatwo (jak to zrobiłeś) dodać to samemu. Wymaga to również użycia parametru ref, który znacznie ograniczy liczbę przypadków użycia. Na przykład nie można tego zrobić:

List<int> test; 
// ... 
Swap(ref test[0], ref test[1]); // won't work, it's an indexer, not an array 
Powiązane problemy