【发布时间】:2013-11-09 13:14:59
【问题描述】:
我的问题是,当进程异常终止时(通过信号,它可能是 SIGKILL,因此我们无法拦截它),是否有任何保证释放其资源的顺序或原子性?特别是,我对文件锁和共享内存感兴趣。
例如:
1) 如果进程持有 2 个文件的锁并且异常终止,那么尝试锁定相同文件的另一个进程是否有可能看到一个文件被锁定而另一个文件被解锁?还是从其他进程的角度来看,释放文件锁的过程是原子的?
如果它不是原子的,是否至少有一个预定义的顺序,文件锁将被终止进程释放(例如,以它们最初被锁定的相反顺序)?
2) 我想使用文件锁来确保正确的共享内存初始化 - 映射到共享内存的进程将持有共享锁,并且想要映射到同一共享内存段的新进程将尝试测试该锁查看是否需要执行初始化(如果需要,我可以稍后提供更多详细信息)。
但是这里出现了同样的问题:如果一个持有文件锁并映射到共享内存段的进程异常终止,是否有可能在共享内存自动取消映射后,其他进程仍然会看到文件锁被锁定?还是从其他进程的角度来看,共享内存段的取消映射和文件解锁是原子的?
【问题讨论】:
-
我不知道,但我敢打赌 #1 中问题的答案是否定的。
-
你的意思是没有原子性?
-
我很确定,这取决于实现,例如具有内核抢占的实时内核可能会抢占解锁代码,因为只有解锁本身必须是原子的,而不是解锁多个资源。
标签: c multithreading unix ipc shared-memory