我们开发软件的时候,有时候需要多个进程访问同一个资源,这个时候需要进程之间实现函数互斥,实现对同一资源的序列化访问。
要实现进程间互斥,首先,我们要选择一种互斥量,然后,我们使用的这种互斥量,必须要在进程崩溃后,能被系统自动解锁和释放。
如果互斥量在进程崩溃后,不能被系统自动解锁和释放的话,就可能出现进程崩溃重启后,因为互斥量处于锁住状态,导致无法访问资源的情况。
可作为互斥量的系统对象有互斥量(mutex)、信号量、管道、文件锁、socket等等。在进程崩溃后,能被系统自动解锁和释放的有文件锁和socket,因此,这俩最适合实现进程间互斥。
Qt里面自带文件锁类QLockFile,我们只需要在不同的进程创建相同文件名的文件锁对象,即可实现进程间互斥,大致代码如下:
#include <QLockFile>
#include <chrono>
QLockFile lf("/home/pi/myLockFile.lock");
while(!lf.tryLock()) //尝试加锁,tryLock接受超时时间参数
{
//加锁失败,就等待
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
//加锁成功,访问资源
//...
lf.unlock(); //解锁