我有一个在后台运行的程序,它只是每 N 秒截取一次屏幕截图。
例如:
#!/bin/sh
while true; do
take-screenshot
sleep 10
done
Run Code Online (Sandbox Code Playgroud)
我想要实现的只是在屏幕未锁定的情况下截取屏幕截图。例如:
#!/bin/sh
while true; do
if ! screen-is-locking; then
take-screenshot
sleep 10
fi
done
Run Code Online (Sandbox Code Playgroud)
如何确定我的桌面是否在命令行中锁定?
我了解到信号量可以充当原子锁,可以执行两个功能:down和up。
有没有办法以value原子方式交换两个指针,避免竞争条件和死锁。
我首先想出了“解决方案”,假设两个指针都有:
Item a = { value = "A", lock = Semaphore(1) }
Item b = { value = "B", lock = Semaphore(1) }
void atomic_swap(Item* a, Item* b) {
a->lock.down(); // acquire
b->lock.down(); // acquire
non_atomic_swap(&a.value, &b.value);
b->lock.up(); // release
a->lock.up(); // release
}
Run Code Online (Sandbox Code Playgroud)
atomic_swap但如果我没记错的话,如果使用相同的指针调用两个,则会导致死锁:例如。
Item a = ...;
Item b = ...;
thread_start(atomic_swap, {&a, &b}); // start a thread running atomic_swap(&a, &b);
thread_start(atomic_swap, {&b, &a}); // start a thread …Run Code Online (Sandbox Code Playgroud)