Как стать автором
Обновить

Комментарии 14

Жуткий перевод.
Что-то гуглетранслейт не в ударе сегодня.

Это из какого года статья?
Я точно помню, что впервые, как я посмотрел на errno, это уже был макрос на функцию. Так что никаких проблем с многопоточностью.
Если я правильно понял man7.org/linux/man-pages/man7/signal-safety.7.html, там явно указано, что надо сохранить errno и восстановить, если хотите вызывать функции из разрешённого списка, устанавливающие errno.
Какая разница какого года статья, если в ней обсуждается “единый UNIX”, каким он был до седьмой версии (то есть до 1980го года).
А как-то сомневаюсь, что вам повезло с ним в те годы познакомиться. Разве что вы ДЕМОС застали (я про него только в книжках читал).
Я точно помню, что впервые, как я посмотрел на errno, это уже был макрос на функцию. Так что никаких проблем с многопоточностью.
Ну да, только куча проблем с эффективностью.

Вообще на 32-битных системах это плохой интерфейс. Применямый в Linux (всё что от -4095 до -1 — ошибка, вне этого диапазона — возвращаемое значение) гораздо удобнее.

Ваш man в отношение к обсуждаемой статье — это что-то из далёкого “светлого” будущего.

С многопоточностью проблемы errno вполне решаемы (главное чтоб кто-то захотел их решать). Просто тред-зависимую переменную сделать и всё.

Она уже лет 15-20 такая

видимо не везде, раз статьи вот такие появляются

Не слышал про платформы поддерживающие многопоточность и не поддерживающие __thread/pthread_setspecific для errno. МК-шные платформы в многопоточность не очень.

я тоже не слышал, может автор нам пример приведёт?

А вас не смутило что в статье обсуждается Unix 30-летней давности, нет?

Современный C способен на такие фокусы, как возврат двухэлементной структуры в паре регистров

Никогда не видел такого :/ Это время уже прошло или ещё не наступило?

Полагаю, что автор имел в виду что-то вроде
struct s {
    int a;
    int b;
};

struct s func(int a, int b) {
    struct s is;
    is.a = a;
    is.b = b;
    return is;
}

func:
movd xmm0, edi
movd xmm1, esi
punpckldq xmm0, xmm1
movq rax, xmm0
ret
Аааа… мои глаза! Это что за компилятор у вас такую дичь нагенерил? Нормальный же код большая четвёрка порождает.

Но тут у вас один регистр. Чтобы два было нужно, скажем, указатель и код ошибки вернуть

Но главная проблема с обсуждаемыми временами — это даже не то, что структуру нельзя вернуть эффективно, а то, что её нельзя вернуть вообще. K&R C этого не поддерживает. Хотя C89 поддерживает и многие компиляторы так умели уже в 80е… но не в обсуждающиеся в статье 70е!
Аааа… мои глаза! Это что за компилятор у вас такую дичь нагенерил?


Gcc 10: gcc.godbolt.org/z/GzPTej6Ka
-O3

В GCC с ним осторожнее надо. Вот именно потому что оно побуждает всё агрессивно векторизовать, засовывать в SIMD'ы, что далеко не всегда приводит к выигрышу в скорости и почти всегда — к проигрышу в размере кода.

Но это как раз потому что в один регистр упаковывать в обычных регистрах не так удобно, когда нужны именно два регистра таких чудес нету.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.