与bdonlan在SO聊天上进行了长时间的讨论之后,我想我有一个解决方案。基本上,我们将问题分为两个自同步释放问题:销毁 *** 作和取消映射。
处理破坏很容易:只需使
pthread_barrier_destroy函数等待所有服务员停止检查障碍即可。这可以通过在屏障中使用计数,在进入/退出等待函数时原子递增/递减以及使destroy函数旋转以使计数达到零来完成。(如果您在使用计数的高位或类似位置贴上一个服务员标志,则也可以在此处使用futex,而不仅仅是旋转)。
处理取消映射也很容易,但也可以是非本地的:通过在syscall包装器中添加锁定,确保在屏障侍者退出过程中不会出现
munmap或
mmap带有
MAP_FIXED标志。这需要一种特殊的读写器锁。最后一个到达障碍的服务员应抓住
munmaprw锁上的读锁,当最后一个服务员退出时(当减少用户计数时,计数为0时),该锁将被释放。
munmap并且
mmap可以通过使Writer锁递归来使其成为可重入的(如某些程序可能期望的那样,即使POSIX不需要它)。实际上,一种读写器是完全对称的,并且每种类型的锁都排除相反类型的锁,但不是同一类型的锁应该是最好的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)