在下面的C99示例中,即使启用-O2优化,
我预计这将在一个对齐的32位读写是原子的系统上运行。
假设只有每个线程的一个实例正在运行,并且没有其他线程正在访问
buffer_full
标志在读取或写入缓冲区后是否保证被设置?或者,我需要一个内存屏障来确保正确的排序?我预计这将在一个对齐的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
的访问是否原子化”?原则上来说,是的。 - Iharob Al Asimiint
是本地的,那么它就是原子性的,只要变量具有非对齐地址。 - LPs