在受限设备上,我经常使用两个布尔值 "模拟" 2 个线程之间的锁。每个布尔值仅由一个线程读取,并且只由另一个线程编写。以下是我的意思:
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;
}
当然,在PC上我不会这样做,但在受限设备上,读取
bool
值似乎比获取锁要快得多。当需要更改缓冲区时,我会用"sleep(50)
"来换取较慢的恢复速度。问题是——它完全线程安全吗?或者在模拟锁时是否存在隐藏的陷阱?或者我根本不应该这样做?