QSystemSemaphore: 在进程里做互斥的建议,针对Linux的特殊说明

关于QT5.5的QSystemSemaphore,英文的帮助文档。

例子

QSystemSemaphore sem("market", 3, QSystemSemaphore::Create);
                             // resources available == 3
sem.acquire();               // resources available == 2
sem.acquire();               // resources available == 1
sem.acquire();               // resources available == 0
sem.release();               // resources available == 1
sem.release(2);              // resources available == 3

为避免碰到特殊情况,在使用的时候,

1 可以使用Open模式创建,但resource count要一直是个固定值,最好是1。

2 如果resource count不是1,就需要注意进程意外挂掉对resource计数的影响。

注意事项来源:

针对Linux的特殊地方是,

1 如果进程意外挂掉,此时QSystemSemaphore创建的信号量可能会存活下来。方法:以对应key访问可以访问到。

2 如果QSystemSemaphore创建的信号量存活了下来,而此时如果使用

QSystemSemaphore::Open
方法去重新创建信号量,例如

QSystemSemaphore sem("market",1, QSystemSemaphore::Open);

这个值1不会生效


此时由于信号量是存活的,所以这里资源数量仍然是3,而不是1


3 如果进程意外挂掉,这个进程里的系统信号量会牵连其他进程。导致该系统信号量资源数量被翻转回原始值。如果原始值是3,那么还是3.


QT小意外。如果原生QT都这样,怕wx这样次生的更会有瑕饬。




你可能感兴趣的:(QSystemSemaphore: 在进程里做互斥的建议,针对Linux的特殊说明)