【发布时间】:2017-01-05 16:07:30
【问题描述】:
在下面的 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_fullatomic?原则上是这样。 -
我认为也是平台相关的。如果
int是本机的,则为原子的,并且变量的地址未对齐。 -
有点。我想确保永远不会读取空缓冲区并且永远不会写入完整缓冲区。我主要关心的是订购。设置 buffer_full 是否会在编译器或硬件显示在代码中之前重新排序。
标签: c multithreading thread-safety memory-barriers