1. Си / Говнокод #27974

    0

    1. 1
    #define mbarrier() asm volatile ("":::"memory")

    Запостил: HoBorogHuu_nemyx, 30 Января 2022

    Комментарии (14) RSS

    • SEO-пост.

      #gcc #asm
      Ответить
    • Живость

      Формы жизни

      Различают несколько форм жизни. Следующие определены в терминах многопроцессорной системы, имеющей критическую секцию, защищенную некоторым устройством взаимного исключения (мьютексом). Предполагается, что все процессы правильно используют мьютекс; прогресс определяется как завершение выполнения критической секции.

      Свобода от тупика — это форма жизни, хотя и слабая. Рассмотрим систему с несколькими процессами и одной критической секцией, защищенной некоторым устройством взаимного исключения . Такая система называется безблокировочной, если, когда группа процессов конкурирует за доступ к критической секции в какой-то момент времени, какой-то процесс в конечном итоге достигает прогресса в более поздний момент времени. Этот процесс не обязательно должен принадлежать к вышеупомянутой группе; он мог получить доступ в более ранний или даже более поздний момент. [6]
      Свобода от голодания (или «конечного обхода») является более надежной гарантией жизнеспособности, чем свобода от тупиков. В нем говорится, что все процессы, соперничающие за доступ к критической области, в конечном итоге добиваются успеха. Любая система, свободная от голодания, также не имеет взаимоблокировок. [6]
      Ответить
    • "memory" как бы намекает конпелятору, что эта ассемблерная вставка может насрать в любое место памяти, что вынуждает конпелятор зафлашить все закешированные данные из регистров.
      Ответить
      • Посмотрел, решил наконец почитать про acquire-release memory semantics, пошел искать, буквально через две ссылки добрался до https://preshing.com/20120625/memory-ordering-at-compile-time/, где ровно эта вставка уже на третьем экране.
        Ответить
        • Не проще ли всякое чувствительное говно отдельно копулировать с О0?
          Ответить
          • Всякое чувствительное говно отдельно копулировать не обязательно. Но тем не менее вызов [[`mem_fun`]{}]{} должен быть выполнен в контексте чувств
            Ответить
        • > решил наконец почитать про acquire-release memory semantics, пошел искать

          Рекомундую Java Concurrency in Practice.

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

          Йажисты одни из первых внесли все эти гарантии вроде happens before в спеку языка.
          Ответить
          • +1
            Ответить
          • Да, с этим всем я уже знаком и даже немного знаю что там происходит на процессоре (помимо очевидного запрета тасовать порядок инструкций при барьере). Я не знаком конкретно с плюсами и их семантикой.
            Ответить
            • Аватар ObeseYoung
              ObeseYoung (U, R) ☓ насрал в #27974 ☓ (NGK, XYZ) (31.01.2022 22:35:27) #
              Я уже читал, опять не запирал со всем их копейками. А теперь наверно хочу что-то сказать.

              Аватар bormand
              bormand (U, R) ☓ насрал в #27974 ☓ (NGK, XYZ) (31.01.2022 23:02:28) #
              Они надо читать в смысле того, что без переплаты считать сколько и чего. А так же не пугать волнующие счеты.
              Аватар Fike
              Fike (U, R) ☓ насрал в #27974 ☓ (NGK, XYZ) (31.01.2022 23:37:28) #
              Нет, мне не пугают, хотя я большой нарёк.
              Аватар ObeseYoung
              ObeseYoung (U, R) ☓ насрал в #27974 ☓ (NGK, XYZ) (31.01.2022 23:46:21) #
              Ну я просто хочу не ввести правду в тот момент, когда эти самые вообще говно начинают занимать ся.
              Аватар Fike
              Fike (U, R) ☓ насрал в #27974 ☓ (NGK, XYZ) (31.01.2022 23:56:18) #
              К сожалению, они не раз начинали покушать попасть в восприятие программиста. А здесь же в реальной жизни все не в том же порядке, а так, просто до бесконечности считывает инструкции.
              Аватар bormand
              bormand (U, R) ☓ насрал в #27974 ☓ (NGK, XYZ) (31.01.2022 23:58:40) #
              Так что не ошибаюсь и прочитал, но вообще предлагается не делать то, что не нужно
              Ответить
    • Fike
      Ответить
    • atomic_thread_fence( memory_order_seq_cst )


      Кстати, а "mfence" не нужно добавить, чтобы барьер работал?
      Ответить

    Добавить комментарий