В приведенном ниже примере C99 установлен флаг buffer_full
(даже при включенной оптимизации -O2) после того, как буфер будет считан или записан на? Или мне нужен барьер памяти, чтобы обеспечить правильный порядок?Нужен ли мне барьер памяти?
Я ожидаю, что это будет запущено на системе, где выровненные 32-битные чтения и записи являются атомарными.
Предположим, что выполняется только один экземпляр каждого потока, и ни один другой поток не обращается к buffer
или buffer_full
.
char buffer[100];
int buffer_full;
// write interesting data to the buffer. does not read.
void fill_buffer(char* buffer, size_t buffsz);
// read the interesting data in the buffer. does not write.
void use_buffer(const char* buffer, size_t buffsz);
void writer_thread()
{
if (!buffer_full) {
fill_buffer(buffer, sizeof(buffer));
// is a memory barrier needed here?
buffer_full = 1;
}
}
void reader_thread()
{
if (buffer_full) {
use_buffer(buffer, sizeof(buffer));
// is a memory barrier needed here?
buffer_full = 0;
}
}
Ваш вопрос немного сложно понять, но я полагаю, вы имеете в виду, что * есть доступ к 'buffer_full' atomic *? В принципе, это так. –
Я думаю, что это также зависит от платформы. Если 'int' является native, является атомарным, а до переменной имеет неприсоединившийся адрес. – LPs
Вид. Я хочу, чтобы пустой буфер никогда не читался, и полный буфер никогда не записывался. В основном я занимаюсь заказом. Будет ли настройка buffer_full когда-либо переупорядочена до того, как она будет показана в коде либо компилятором, либо аппаратным обеспечением. – PaulH