Как правильно использовать станд.:: atomic_signal_fence ()?

cppreference.com документирует эту функцию как "забор между нитью и укладчиком сигнала, казненным в той же самой нити". Но я не нашел примера в Интернете.

Интересно, иллюстрирует ли следующий psuedo-код правильно функцию станд.:: atomic_signal_fence() :

int n = 0;
SignalObject s;

void thread_1()
{
    s.wait();
    std::atomic_signal_fence(std::memory_order_acquire);
    assert(1 == n);//never fires ???
}

void thread_2()
{
    n = 1;
    s.signal();
}

int main()
{
    std::thread t1(thread_1);
    std::thread t2(thread_2);

    t1.join(); t2.join();
}
9
nl ja de
Я думаю, что укладчик сигнала от системного сигнала типа Unix, у которого есть специальные правила пронизывания.
добавлено автор Tony The Lion, источник
Вы don' у t есть любые укладчики сигнала в вашем коде, таким образом, не, код не демонстрирует ничего значащего о atomic_signal_fence .
добавлено автор Kerrek SB, источник
@StefanDragnev - с надлежащими заборами there' s никакая потребность в , изменчивом . That' s, о чем атомная энергетика и заборы - все.
добавлено автор Pete Becker, источник
@StefanDragnev - нет, с забором или любой другой атомной операцией (с соответствующим спецификатором доступа к памяти) компилятору не позволяют сделать это. В том контексте, , изменчивый , избыточно.
добавлено автор Pete Becker, источник
Необходимо объявить n , чтобы быть изменчивый , иначе компилятор может оптимизировать прочитанный далеко.
добавлено автор Stefan Dragnev, источник
@PeteBecker - без , изменчивого , компилятор может оптимизировать доступ к глобальной переменной, например, загрузить его только однажды в регистр, вместо того, чтобы загрузить его каждый раз it' s упомянутый. Использование изменчивый doesn' t означают, что компилятор знает что variable' s стоимость может измениться неочевидными способами, используя явные заборы.
добавлено автор Stefan Dragnev, источник
signal_fence a барьер "компилятора": это предотвращает переупорядочение/объединение/подъем времени компиляции операций по памяти, но никогда не будет испускать барьер памяти аппаратных средств инструкции. Джефф Preshing' s блог превосходно при объяснении этого материала, определенно обязательное для чтения если you' ре, не уверенное в заказывающем память материале.
добавлено автор Peter Cordes, источник

2 ответы

Нет, ваш код не демонстрирует правильное использование atomic_signal_fence . Поскольку вы указываете cppreference.com, atomic_signal_fence только выполняют синхронизацию между укладчиком сигнала и другим кодом, работающим на той же самой нити. Это означает, что не делает , выполняют синхронизацию между два отличающихся нити. Ваш пример кода показывает две различных нити.

Спекуляция C++ содержит следующие примечания об этой функции:

Примечание: оптимизация компилятора и переупорядочения грузов и магазинов запрещаются таким же образом как с atomic_thread_fence , но инструкции по забору аппаратных средств, что atomic_thread_fence вставил бы, не испускаются.

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

Вот пример правильных, не мотивируя, использования:

static_assert(2 == ATOMIC_INT_LOCK_FREE, "this implementation does not guarantee that std::atomic is always lock free.");

std::atomic a = 0;
std::atomic b = 0;

extern "C" void handler(int) {
    if (1 == a.load(std::memory_order_relaxed)) {
        std::atomic_signal_fence(std::memory_order_acquire);
        assert(1 == b.load(std::memory_order_relaxed));
    }

    std::exit(0);
}

int main() {
    std::signal(SIGTERM, &handler);

    b.store(1, std::memory_order_relaxed);
    std::atomic_signal_fence(std::memory_order_release);
    a.store(1, std::memory_order_relaxed);
}

Утверждение, если столкнуто, как гарантируют, будет сохраняться.

16
добавлено
A и B обязательно атомные в вашем примере?
добавлено автор Alex, источник
Тонны Спасибо!
добавлено автор xmllmx, источник

В вашем примере вы хотите использовать станд.:: atomic_thread_fence (который производит машинный код, чтобы выполнить синхронизацию нити); не станд.:: atomic_signal_fence (который только отключает память компилятора reording оптимизация на атомных переменных). Как был сказан другими, станд.:: atomic_signal_fence только предназначается для сигналов на той же самой нити как атомные операции (я полагаю, что это также сохранялось бы для структурированных/векторных обработчиков исключений на Windows, но не цитирует меня на этом).

2
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest