LINUX.ORG.RU

Это не то «atomic». Там про прерывания обновления данных сигналами.

И до того текста ведь указано "In practice, ", там где glibc работает, а не всегда.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)

Очевидно, что в плоской модели адресации указатель — просто целое 32 или 64 битное число, над которым можно производить атомарные операции. В общем случае — нет. Например, в модели СЕГМЕНТ:СМЕЩЕНИЕ это не так.

aureliano15 ★★
()
Последнее исправление: aureliano15 (всего исправлений: 2)

Both of these assumptions are true on all of the machines that the GNU C Library supports

BackDoorLover
()

То есть указатели всегда атомарные даже без дополнительных инклудов и atomic?

Тут вопрос в том, что конкретно понимается под «atomic».

Операции над интами и указателями будут атомарными в том смысле, что при любом чтении из переменной, будет получаться либо целиком старое значение, либо целиком новое.

Но при этом, явно заданные атомарные типы могут обладать другими свойствами в зависимости от платформы и компилятора. Например, gcc и clang не пытаются делать некоторые оптимизации операций над атомиками, в этом они похожи на volatile (но не обязаны обладать всеми свойствами volatile). На x86/x86_64 операции над атомиками являются барьером.

im-0
()
Последнее исправление: im-0 (всего исправлений: 3)

на это лучше не завязываться.

zerhud
()
Ответ на: комментарий от im-0

Операции над интами и указателями будут атомарными в том смысле, что при любом чтении из переменной, будет получаться либо целиком старое значение, либо целиком новое.

Даже если одновременно производить запись в эти переменные?

metaprog
() автор топика
Ответ на: комментарий от metaprog

Записи одновременные нужно лочить семафорами, мьютексами и аналогами, одновременно можно только считывать

menangen ★★★★★
()
Ответ на: комментарий от metaprog

Даже если одновременно производить запись в эти переменные?

Да.

На самом деле даже тут могут быть тонкости. Скажем, если int окажется не выровнен как положено, то чтение и запись перестанут быть атомарными. Скорее всего, я не тестил.

Я на твоём месте:

  • Ни в каких случаях не надеялся бы на атомарность операций над «обычными типами».
  • Явные атомарные типы тоже старался бы избегать, и использовал бы более высокоуровневые примитивы везде, где это возможно. Мьютексы, lock-free структуры данных и алгоритмы из готовых популярных библиотек.
im-0
()
Ответ на: комментарий от im-0

Операции над интами и указателями будут атомарными в том смысле, что при любом чтении из переменной, будет получаться либо целиком старое значение, либо целиком новое.

Даже если данные не выровнены?

X512 ★★★★★
()
Ответ на: комментарий от X512

Даже если данные не выровнены?

Если не выровнены, то скорее всего атомарность теряется. Но я не тестировал и не уверен. Смотри моё предыдущее сообщение.

im-0
()
Ответ на: комментарий от metaprog

Операции над интами и указателями будут атомарными в том смысле, что при любом чтении из переменной, будет получаться либо целиком старое значение, либо целиком новое.

Даже если одновременно производить запись в эти переменные?

Физически одновременная запись невозможна, даже при наличии нескольких процессоров или ядер. Если 2 проца одновременно обращаются к одной и той же памяти, то одному из них по-любому придётся ждать. А скорее всего каждый процессор будет обращаться к своему кэшу. Поэтому да. За исключением случая, когда переменные не выровнены, о чём здесь уже упоминали.

aureliano15 ★★
()
Ответ на: комментарий от X512

Если у тебя в программе на C появились невыровненные int-ы, то это произошло в результате UB.

anonymous
()

Да, атомарны. Но если несколько разных процессов «одновременно» будут писать то ты не контролируешь порядок ибо планировщик как решит так и решит, так что во первых атомарны и быть не физически невозможно, а вот контролировать порядок доступа всё же ты должен как минимум семафорами или более фичастыми фичами.

anonymous
()
Ответ на: комментарий от anonymous

Это уже не программа на C

Не фантазируй. «Программа на Си» - это исходный код, разобранный препроцессором и компилятором Си без синтаксических ошибок. Вся семантика, включая UB - это уже забота программиста.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Хороший пук в лужу, поздравляю. «Это уже не программа на C» было про использование нестандартных прагм для упаковки структур, а не про наличие UB.

anonymous
()
Ответ на: комментарий от LamerOk

«Программа на Си» - это исходный код, разобранный препроцессором и компилятором Си без синтаксических ошибок.

А если UB на уровне препроцессора и компилятор об этом не стал тебе говорить — это считается за разбор без синтаксических ошибок?

anonymous
()
Ответ на: комментарий от anonymous

это считается за разбор без синтаксических ошибок?

Компилятор выдал ошибку? Ошибочная. Не выдал - синтаксически валидная. Всё остальное - школофантазии.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Стандарт разрешает не выдавать ошибки для некоторых синтаксически невалидных C-программ.

anonymous
()
Ответ на: комментарий от LamerOk

Компилятор выдал ошибку? Ошибочная. Не выдал - синтаксически валидная.

Программа, разыменовывающая NULL, вполне себе может быть синтаксически корректной. Это не гарантирует определённость поведения.

i-rinat ★★★★★
()

То есть указатели всегда атомарные даже без дополнительных инклудов и atomic?

Это не та атомарность, о которой ты подумал.

i-rinat ★★★★★
()

Главное понимать, что тут атомарность не имеет отношения к многопоточности. Тут только про то, что операция изменения атомарных типов не будет прервана посередине.

Если речь о многопоточности, то делать блокировки всё равно придется. На некоторых многопроцессорных архитектурах ты получишь проблемы с доступом к таким атомарным типам из разных потоков.

Но если просто поговнокодить под PC, то наверное сойдёт.

sergej ★★★★★
()
Ответ на: комментарий от i-rinat

Почитай, о чём срач.

Программа, разыменовывающая NULL, вполне себе может быть синтаксически корректной.

Это, таки, по-прежнему программа «на Си» или уже на алголе?

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Почитай, о чём срач.

Почитал. Там про упакованные структуры, которых в Си как-бы нет. Но они есть в диалектах Си, которые реализуют компиляторы. Так что формально аноним прав, а ты нет. Или я опять не так понял?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Или я опять не так понял?

Да.

  1. Срач про термин «программы на Си». Анонимный шизик утверждает, что этому определению соответствует не то, что соответствует требованиям компиляторов, а то, что соответствует его анонимному манямирку.

Там про упакованные структуры, которых в Си как-бы нет.

Нужного эффекта можно даже без всякого приведения типов легко и непринуждённо добиться обычными объединениями , что в Си как бы очень даже есть, и составляет чуть ли не основу языка. В этом контексте корчить морду от «packed»’ов может только полный шиз.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Это, таки, по-прежнему программа «на Си» или уже на алголе?

Есть такая штука, как https://en.wikipedia.org/wiki/Polyglot_(computing). Это такое упражнение — создавать наборы символов, которые являются синтаксически верными программами сразу на нескольких языках. На странице в википедии приводится пример:

#define a /*
#<?php
echo "\010Hello, world!\n";// 2> /dev/null > /dev/null \ ;
// 2> /dev/null; x=a;
$x=5; // 2> /dev/null \ ;
if (($x))
// 2> /dev/null; then
return 0;
// 2> /dev/null; fi
#define e ?>
#define b */
#include <stdio.h>
#define main() int main(void)
#define printf printf(
#define true )
#define function
function main()
{
printf "Hello, world!\n"true/* 2> /dev/null | grep -v true*/;
return 0;
}
#define c /*
main
#*/

Это программа одновременно и на Си, и на Bash, и на PHP.

i-rinat ★★★★★
()
Ответ на: комментарий от LamerOk

утверждает, что этому определению соответствует не то, что соответствует требованиям компиляторов

Пример программы сразу на нескольких языках можно видеть в одном из сообщений выше.

Нужного эффекта можно даже без всякого приведения типов легко и непринуждённо добиться обычными объединениями

Речь всё ещё про невыровненный доступ к int? Можешь привести пример, реализующий такое через union’ы?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Пример программы сразу на нескольких языках можно видеть в одном из сообщений выше.

Но у тебя была другая задача - доказать, что это НЕ программа на Си.

Можешь привести пример, реализующий такое через union’ы?

Могу, но хочу оставить ловлю SIGBUS'а домашкой для анона.

LamerOk ★★★★★
()

а чего ты хочешь вообще? Я понимаю у тебя там вообще своя теория, которая строится на каких-то абстрактных хотелках и полном отсутствии знаний вообще по всем фронтам. Сам указатель как тип данных может быть и атомарным. А может быть и нет. Особенно учитываю ту херню (касты через касты через касты), что ты можешь своей поделкой нагенерить.

anonymous
()
Ответ на: комментарий от LamerOk

Но у тебя была другая задача - доказать, что это НЕ программа на Си.

Странно. Утверждаешь что-то ты, а доказывать нужно почему-то другим. Контрпримеры тебе привели, дальше ты уж как-нибудь сам.

домашкой

А, ну понятно. Ты из этих, «я всё знаю лучше других».

i-rinat ★★★★★
()

Атомарны – да. Только нужно использовать ассемблерную всявку с соответсвующей атомарной операцией.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

Что наоборот? Я говорю, что атомарные операции атомарны по определению, вот и всё. Или бывают атомарные, которые не атомарны?

aureliano15 ★★
()
Ответ на: комментарий от i-rinat

Это уже не программа на C

«Программа на Си» - это исходный код, разобранный препроцессором и компилятором Си без синтаксических ошибок.

Пример программы сразу на нескольких языках можно видеть в одном из сообщений выше.

Но у тебя была другая задача - доказать, что это НЕ программа на Си.

Странно. Утверждаешь что-то ты, а доказывать нужно почему-то другим.

Возвращайся, когда научишься читать.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от aureliano15

Ты запятые видишь?

Это работает вот так!
Да нет!
Нет да!
Да нет же!
Нет да я сказал.
А ну раз ты так сказал то да.
anonymous
()
Ответ на: комментарий от LamerOk

Возвращайся, когда научишься читать

Сначала ты научись

Это уже не программа на C

Это сказал тебе анон. А не Ринат.

Ты сказал что программа на си это то что компилятор сожрал без ошибок, а Ринат тебе показал программу написанную на баше которая валидна и для си.

И да. Программа на си это программа которая написана в полном соответствии стандарту языка. А что там жрёт компилятор дело десятое и большая часть это именно диалекты си он прав. Когда ты сам не замечая того юзаешь gcc расширения то ты не на си пишешь, а на диалаекте, у него даже имя есть задающееся в опции по умолчанию -std=gnu99 например и поведение уже зависит от реализации компилятора, а не от того что написано в стандарте языка.

anonymous
()
Ответ на: комментарий от anonymous

Это работает вот так! Да нет! Нет да! Да нет же! Нет да я сказал. А ну раз ты так сказал то да.

Очень интересный диалог. Но к чему он тут?

aureliano15 ★★
()
Ответ на: комментарий от anonymous

а Ринат тебе показал программу написанную на баше которая валидна и для си.

Значит это программа на си и баше.

anonymous
()
Ответ на: комментарий от LamerOk

Атомарны ли указатели в Си? (комментарий)

Там про упакованные структуры, которых в Си как-бы нет. Но они есть в диалектах Си, которые реализуют компиляторы. Так что формально аноним прав, а ты нет.

Возвращайся, когда научишься читать.

Ну да, ну да. Очередная заявка на превосходство.

i-rinat ★★★★★
()
Ответ на: комментарий от aureliano15

Что наоборот? Я говорю, что атомарные операции атомарны по определению, вот и всё. Или бывают атомарные, которые не атомарны?

Бывают ещё и молекулярные.

kostyarin_ ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.