Im folgenden C99-Beispiel wird das Flag buffer_full
garantiert gesetzt (auch wenn -O2-Optimierungen aktiviert sind), nachdem der Puffer gelesen oder geschrieben wurde? Oder brauche ich eine Speicherbarriere, um die richtige Reihenfolge zu gewährleisten?Benötige ich eine Speicherbarriere?
Ich erwarte, dass dies auf einem System ausgeführt wird, bei dem ausgerichtete 32-Bit-Lese- und Schreibvorgänge atomar sind.
Angenommen, nur eine Instanz jedes Threads wird ausgeführt und keine anderen Threads greifen auf buffer
oder buffer_full
zu.
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;
}
}
Ihre Frage ist ein bisschen schwer zu verstehen, aber ich nehme an, Sie meinen, * ist der Zugriff auf 'buffer_full' atomare *? Im Prinzip ist es so. –
Ich denke, ist auch plattformabhängig. Wenn "int" nativ ist, ist es atomar, und soweit die Variable eine nicht ausgerichtete Adresse hat. – LPs
Sortieren von. Ich möchte sicherstellen, dass ein leerer Puffer nie gelesen wird und niemals ein voller Puffer geschrieben wird. Ich bin hauptsächlich besorgt über die Bestellung. Wird die Einstellung buffer_full jemals neu geordnet, bevor sie entweder vom Compiler oder von der Hardware im Code angezeigt wird? – PaulH