2017-02-01 1 views
5

Я не знаю, почему было бы желательно, чтобы эта функция имела связь «С», а не «С ++».Почему std :: atomic_thread_fence имеет ссылку «C»?

+4

Не может быть, потому что одна и та же функция существует в 'C' http://en.cppreference.com/w/c/atomic/atomic_thread_fence, и это только импортированная (в пространстве имен std)? –

ответ

0

atomic_thread_fence устанавливает порядок синхронизации памяти неатомных и расслабленных атомных доступов.
Параллелизм, особенно параллелизм с расслабленной памятью, является известным тонким и подверженным ошибкам доменом, поэтому проверка таких оптимизаций представляет большой интерес. Ref1.
Для таких вещей широко используется CompCertTSO.
CompCertTSO - это компилятор, который генерирует ассемблерный код x86 от ClightTSO, большого подмножества языка программирования C, расширенного с помощью примитивов параллелизма для управления потоками и синхронизации, и с моделью ослабленной памяти TSO на основе модели x86-TSO.

Таким образом, для проверки, оптимизации и тестирования желательно, чтобы эта функция имела связь «C».

5

Это было добавлено LWG issue 1479, которое обращалось к комментарию последней минуты на C++ 11.

Обоснованием для этого изменения была совместимость на языке C (библиотека потоков C11 имеет идентичную функцию atomic_thread_fence в stdatomic.h).

Насколько я понимаю, всегда существовал план, в котором могли бы сосуществовать атомные библиотеки C и C++. Другими примерами совместимости являются псевдонимы типа C для std :: atomic, такие как atomic_int и макрос совместимости C ATOMIC_VAR_INIT

+0

Я не понимаю, как прототипы C и C++ совместимы, учитывая, что прототип C++ находится в пространстве имен std. – WaltK

+0

@WaltK Я бы предположил, что это позволяет реализовать C++-реализацию '', чтобы включить '', а затем сказать' namespace std {using :: atomic_thread_fence; } 'или что-то подобное. Конечно, это не помогает 'atomic_flag_test_and_set', который все еще имеет C++-ссылку в C++ - возможно, комментарий NB не был продумано так хорошо. – Cubbi

+3

@WaltK точно так же, как 'sin' или' printf'. –