Do I need a memory barrier?

In the C99 example below, the flag is set buffer_full(even when -O2 optimization is enabled) after reading or writing a buffer? Or do I need a memory barrier to ensure the correct order?

I expect this to be run on a system where aligned 32-bit reads and writes are atomic.

Suppose that only one instance of each thread is running, and no other thread is accessing bufferor 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;
    }
}
+4
source share
1 answer

, , buffer_full fill_buffer() read_buffer(). ( ) , .

, buffer_full , , . , fill_buffer() use_buffer() , , .. writer_thread() reader_thread(), . , , .

, , - , , , , _Atomic, volatile , .

, , ( ), , . volatile (. C ++?). buffer_full , , , , buffer ( ).

+3

Source: https://habr.com/ru/post/1652885/


All Articles