Primitivas de sincronización primitiva: ¿seguro?
En dispositivos restringidos, a menudo me encuentro bloqueos "falsos" entre 2 hilos con 2 bools. Cada uno solo es leído por un hilo, y solo escrito por el otro. Esto es lo que quiero decir:
bool quitted = false, paused = false;
bool should_quit = false, should_pause = false;
void downloader_thread() {
quitted = false;
while(!should_quit) {
fill_buffer(bfr);
if(should_pause) {
is_paused = true;
while(should_pause) sleep(50);
is_paused = false;
}
}
quitted = true;
}
void ui_thread() {
// new Thread(downloader_thread).start();
// ...
should_pause = true;
while(!is_paused) sleep(50);
// resize buffer or something else non-thread-safe
should_pause = false;
}
Por supuesto, en una PC no haría esto, pero en dispositivos restringidos, parece leer unbool
l valor @ sería mucho más rápido que obtener un bloqueo. Por supuesto, cambio por una recuperación más lenta (ver "sleep(50)
") cuando se necesita un cambio en el búfer.
La pregunta: ¿es completamente seguro para subprocesos? ¿O hay problemas ocultos que debo tener en cuenta al fingir cerraduras como esta? ¿O no debería hacer esto en absoluto?