На ограниченных устройствах я часто нахожу себя "поддельными" замками между двумя потоками с двумя bools. Каждый из них читается только одним потоком и только написан другим. Вот что я имею в виду:
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;
}
Конечно, на ПК я бы этого не делал, но на ограниченных устройствах, кажется, чтение значения bool
было бы намного быстрее, чем получение блокировки. Конечно, я отменяюсь для более медленного восстановления (см. "sleep(50)
" ), когда требуется изменение буфера.
Вопрос - полностью ли он потокобезопасен? Или есть скрытые gotchas, о которых мне нужно знать, когда притворяются такими замками? Или я не должен этого делать вообще?