int operacją atomową?

int operacją atomową?
Miang
  • Rejestracja:około 7 lat
  • Ostatnio:3 minuty
  • Postów:1674
0

Mam wrażenie że pisanie do int w c nie jest operacją atomową ale potrzebuję jakiś argumentów


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
RE
kurde polecałem ci książkę ostatnio, i pamiętam że tam jest rozdizał o peracjach atomowych "Rozdział 5. Model pamięci języka C++ i operacje na typach atomowych (157)"
Miang
kupiłam jeszcze nie przeczytałam , ale pamiętaj że ja piszę nie w c++ ale w C,
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
4

Samo pisanie może i jest ale np. inkrementacja lub warunkowe pisanie (get-check-write) już niekoniecznie.

Po cos co powstało:
https://en.cppreference.com/w/cpp/atomic/atomic

Zobacz pozostały 1 komentarz
vpiotr
Zalezy jak sie przeklada na asm, moze byc kilka instrukcji - wtedy nie.
Azarien
@vpiotr a jest jakaś architektura na której int może zostać zmieniony w połowie odczytywania?
AL
@Azarien: AVR 8 bit np.
Miang
to oprogramowanie ma działać na różnych prockach wiec nie mogę nic zakładać ;)
Azarien
@Miang: no to bezpieczniej jest założyć że nie masz żadnych gwarancji których nie ma jawnie w kodzie.
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 lata
  • Postów:1493
4

@Miang standard tak mówi. Od atomowości masz stdatomic.h

I mówisz o atomic w rozumieniu „thread safe”, czy atomic w kontekście sygnałów? To nie jest to samo.

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 13 godzin
8

atomowość bez jawnego prefiksu lock zależy od wyrównania adresu:

https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html

8.1.1 Guaranteed Atomic Operations

The Intel486 processor (and newer processors since) guarantees that the following basic memory operations will
always be carried out atomically:

  • Reading or writing a byte
  • Reading or writing a word aligned on a 16-bit boundary
  • Reading or writing a doubleword aligned on a 32-bit boundary

The Pentium processor (and newer processors since) guarantees that the following additional memory operations
will always be carried out atomically:

  • Reading or writing a quadword aligned on a 64-bit boundary
  • 16-bit accesses to uncached memory locations that fit within a 32-bit data bus

The P6 family processors (and newer processors since) guarantee that the following additional memory operation
will always be carried out atomically:

  • Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line

oczywiście powyższe dotyczy pojedynczej operacji odczytu albo zapisu (czyli instrukcji mov), ale nie modyfikacji (czyli np. add [memory], cośtam)


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
MarekR22
486 miały jeszcze jeden rdzeń, jak pojawiły się procesory z wieloma rdzeniami i wiele poziomów cache to sprawa się bardziej skomplikowała.
Wibowit
owszem, pojawiło się wiele rdzeni, ale gwarancje pozostały: The Intel486 processor (and newer processors since) guarantees ...
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 lata
  • Postów:1493
4

@Wibowit: pisze o Intelu. Na ARM ztcp z kolei masz read-modify-write i nie ma przeciwwskazań, żeby coś tam wlazło z innego wątku/dma podczas tego cyklu. Jak chcesz atomowo to wjeżdżają instrukcje/intrinsici ldrex/strex albo typy z stdatomic (które efektywnie się do powyższych kompilują).

EDIT @Miang jestem na komórce teraz, ale na godbolcie podgląd asma jest Twoim przyjacielem jak chcesz dowodów. Mogę Ci potem wrzucić przykłady.

EDIT2: taki int bez synca może wylądować w rejestrze i będziesz mieć potencjalnie dwie różne zmienne bo optymalizator nie wie o wielowątkowości. Wtedy potencjalnie może pomoc volatile… ale to nie służy do synchronizacji.

edytowany 3x, ostatnio: alagner
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 13 godzin
4

x86 ma ogólnie (czyli nawet bez otaczania lockami) dość silną synchronizację danych (silniejszą niż to co jest wymagane przez modele pamięci z javy, c++, itp itd), więc ludzie programujący i testujący tylko i wyłącznie na x86 mogą nie wyłapać błędów w swoich programach.

alagner napisał(a):

EDIT2: taki int bez synca może wylądować w rejestrze i będziesz mieć potencjalnie dwie różne zmienne bo optymalizator nie wie o wielowątkowości. Wtedy potencjalnie może pomoc volatile… ale to nie służy do synchronizacji.

co więcej, bez volatile / atomic / etc optymalizator w kompilatorze może poprzestawiać instrukcje, jeśli model pamięci kompilatora na to pozwala i to nawet wbrew gwarancjom platformy x86.

ogólnie trzeba poczytać o tym: https://en.wikipedia.org/wiki/Memory_model_(programming)


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Miang
  • Rejestracja:około 7 lat
  • Ostatnio:3 minuty
  • Postów:1674
0

@Wibowit:

czyli mój kolega właściwie ma rację tylko zapomniał ze piszemy też na ARM ;)


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
stivens
co tam piszecie na tego ARMa tak z ciekawosci? Jesli NDA nie zabrania ofc.
AL
Ma z dokładnością do optymalizatora :p „Działa na O0, na O3 nie” :p
Miang
takie urządzenie elektroniczne na tym zbudowane, więcej szczegółów to rzeczywiście tajne/poufne ;)
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:6 minut
0

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
SL
  • Rejestracja:około 7 lat
  • Ostatnio:około 5 godzin
  • Postów:896
4

@Miang: atomici to kontrakt. Ty używasz kontraktu w dobry sposób -> kompilator wygeneruje kod, który robi to co mówi kontrakt. Nie znaczy to, że bez atomiców nie będziesz miał atomowych operacji dla konkretnej wersji kompilatora, operacji i architektury procesora. Przykładowo x86 jest dużo bardziej "atomowe" niż ARM, więc kod, który przypadkiem działa na intelach może się wywalić na innych prockach. Jak chcesz zachować zdrowie psychiczne to używasz atomiców, bo ich używanie samo w sobie jest ciężkie nie mówiąc o UB. Poczytaj o tym https://abseil.io/docs/cpp/atomic_danger

stivens
Jak chcesz zachować zdrowie psychiczne to nie programujesz w C lub C++ :D
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0

tak po pierwsze, to int nie jest operacją


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.