1. C++ / Говнокод #17681

    +51

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    template<class T, size_t N>
    constexpr size_t sa(T (&)[N])
    {
    	return N;
    };
    
    static std::memory_order mmo[] = 
    {
        memory_order_relaxed,
        memory_order_consume,
        memory_order_acquire,
        memory_order_release,
        memory_order_acq_rel,
        memory_order_seq_cst
    };
    
    std::memory_order current_program_memory_order()
    {
    	return mmo[rand()%sa(mmo)];
    }
    
    void current_program_memory_barier()
    {
    	std::atomic_thread_fence(current_program_memory_order());
    }

    Запостил: LispGovno, 23 Февраля 2015

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

    • Интересно какого вида придется вставить барьер компилятора и барьер памяти в код компилятору при таком коде при вызове функции current_program_memory_barier();
      Ответить
      • gcc тупо воткнул самый жирный, seq_cst:
        _Z29current_program_memory_barierv:
        .LFB2697:
                .cfi_startproc
                subq    $8, %rsp
                .cfi_def_cfa_offset 16
                call    rand
                mfence ; <-------------------- full barrier
                addq    $8, %rsp
                .cfi_def_cfa_offset 8
                ret
                .cfi_endproc
        Ответить
        • Как он блин догадался... Умные все стали... Почему было не сделать тупо
          std::atomic_thread_fence<std::memory_ord er_seq_cst>(); вместо std::atomic_thread_fence(std::memory_ord er_seq_cst);
          Ответить
          • У меня есть подозрение, что он втыкает seq_cst при любом неизвестном во время компиляции параметре...
            Ответить
            • так и есть: https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

              Note that the C++11 standard allows for the memory model parameter to be determined at run time rather than at compile time. These built-in functions map any run-time value to __ATOMIC_SEQ_CST rather than invoke a runtime library call or inline a switch statement. This is standard compliant, safe, and the simplest approach for now.
              Ответить

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