int operacją atomową?

int operacją atomową?
Miang
  • Rejestracja:około 7 lat
  • Ostatnio:minuta
  • Postów:1666
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 2 godziny
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 2 godziny
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:minuta
  • Postów:1666
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:około 3 godziny
0

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
SL
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 godziny
  • Postów:881
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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)