Можно ли добиться того, чтобы в многопоточной программе без блокировок всегда было 2 строки кода, которые всегда выполнялись в порядке? - PullRequest
0 голосов
/ 25 мая 2019
atomic_compare_exchange_strong_explicit(mem, old, new, <mem_order>, <mem_order>);
ftruncate(fd, <size>);

Все, что я хочу, это чтобы эти две строки кода всегда возникали без помех (БЕЗ ИСПОЛЬЗОВАНИЯ ЗАМКОВ). Сразу после этого CAS должен быть вызван ftruncate (2). Я прочитал небольшое описание о порядке памяти, хотя я их мало понимаю. Но они, казалось, сделали это возможным. Есть ли способ обойти?

1 Ответ

2 голосов
/ 25 мая 2019

Ваш заголовок просит, чтобы вещи происходили по порядку.Это легко, и C ++ делает это автоматически с mo_seq_cst;все видимые побочные эффекты CAS появятся до любого из ftruncate.

О каких помех вы беспокоитесь?Какой-то другой поток, изменяющий размер файла?Вы не можете предотвратить это состояние гонки.

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

Или вам нужна блокировка.(Или как-то приостановить все остальные потоки вашего процесса.)

...