2016-05-01 15 views
8

Używanie blokad i muteksów jest nielegalne w przypadku trudnych wywołań zwrotnych w czasie rzeczywistym. Zablokowane zmienne wolne mogą być odczytywane i zapisywane w różnych wątkach. W języku C definicja języka może, ale nie musi być zepsuta, ale większość kompilatorów wypluwa użyteczny kod zestawu, biorąc pod uwagę, że zmienna jest deklarowana jako lotna (wątek czytnika traktuje zmienną jako rejestr sprzętowy, a tym samym faktycznie wydaje instrukcje ładowania przed użyciem zmiennej, który działa wystarczająco dobrze w większości systemów wieloprocesorowych współpracujących z pamięcią podręczną.)Współdzielona zmienna blokująca w Swift? (działające zmienne)

Czy ten typ dostępu zmiennego można znaleźć w Swift? Czy zamiast tego zamiast języka migowego należy dodać wbudowany język assemblera lub pamięć podręczną danych?

Dodano: Czy będzie używany wywołanie OSMemoryBarrier() (z OSAtomic.h) przed i po oraz każde użycie lub aktualizacja dowolnych potencjalnie zmiennych międzywątkowych (takich jak "lock-free" liczniki stanu fifo/buffer, itp.) w Swift wymusza odpowiednio uporządkowane ładowanie pamięci i instrukcje przechowywania (nawet na procesorach ARM)?

+0

Dlaczego każdy język wysokiego poziomu powinien definiować konstrukcję dla funkcji, która tylko (wydaje się) działać dla pewnej architektury sprzętowej, ale może być skompilowana dla wielu, w tym dla słabo zamawianego modelu pamięci (ARM)? Co więcej, C 'volatile' nigdy nie działa _reliable_ dla tego, czego szukasz. – CouchDeveloper

+0

Jednym z twierdzeń jest to, że Swift ma na celu być użytecznym językiem programowania systemu siłowego. Systemy przemysłowe są często połączone z konkretnymi danymi fizycznymi i kontrolami klienta, które mają restrykcje operacyjne w czasie rzeczywistym. – hotpaw2

+0

W takich scenariuszach nadal można korzystać z interfejsu API C. Ale 'volatile' nie będzie odpowiedni do rozwiązywania równoczesnych problemów. Czy zapoznałeś się z [biblioteką operacyjną Atomics] (http://en.cppreference.com/w/c/atomic) w standardzie C11? Są prymitywy wolne od blokady. – CouchDeveloper

Odpowiedz

2

Jak już wspomniano, volatile gwarantuje jedynie, że zmienna nie zostanie zapisana w pamięci podręcznej do rejestrów (zostanie potraktowana sama jako rejestr). Samo to nie blokuje dostępu do czytania i pisania. Nie gwarantuje nawet swojej atomowości, przynajmniej nie w spójny, wieloplatformowy sposób.

Dlaczego? Instrukcja potokowania i przewymiarowania (np. Użycie Float64 na platformie z 32-bitowymi lub mniejszymi rejestrami zmiennoprzecinkowymi) przychodzi na myśl.

W związku z tym, czy rozważałeś użycie OSAtomic?

+0

Jest wiele rzeczy, które nie są wieloplatformowe, ale nadal powinny być możliwe w języku programowania wysokiego poziomu dla określonych zestawów systemów. Specyfika platformy nie musi oznaczać "musisz kodować w języku asemblerowym". Podręcznik ARM określa pewne wymagania dotyczące wyrównania i wielkości zapisu atomowego. – hotpaw2

+0

To prawda, że ​​podczas opracowywania określonego procesora możesz wziąć odpowiedzialność na wyższych poziomach, a język programowania powinien Cię wspierać. Obawiam się jednak, że Swift nie ma alternatywy dla 'volatile', przynajmniej z tego, co wiem. –

Powiązane problemy