使用C / C ++命名进程内部互斥锁?

时间:2011-09-23 20:24:51

标签: c++ c multithreading pthreads mutex

有没有办法使用C / C ++(在Unix / Linux中)实现命名的进程内部互斥体?

诀窍是互斥体的生命周期需要是持久的。与例如命名的posix信号量和共享内存不同。

您可以在动态地图中使用pthread互斥锁,并使用一些ID访问它们。但是你需要以某种方式保护互斥锁。

如果使用内存映射文件或共享内存,则会获得文件系统持久性...

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您始终可以恢复到较旧(尽管已折旧)的System V信号量,这些信号量可以处理公共键值,而不是具有文件系统持久性的POSIX命名信号量。话虽这么说,如果你在使用它的每个进程中关闭并取消链接信号量,那么名为信号量的POSIX将不具有文件系统持久性。一旦使用信号量的最后一个进程退出,信号量引用将从文件系统中删除。如果您担心信号量在文件系统级别的可见性,则始终可以在信号量的名称前面加上“。”。为了使文件不可见,和/或调整文件的权限,以便只有当前用户或某个特权用户/组才能访问信号量。

答案 1 :(得分:1)

“流程持久性”是什么意思?如果您希望它们在进程结束后保持不变,只需使用命名信号量或命名共享内存,并在名称前加上程序特有的内容。如果您希望它们在进程终止时不再存在,只需使用受rwlock保护的任何类型的哈希映射(在读取模式下锁定以查找现有名称,写入模式以添加/删除名称)。

答案 2 :(得分:1)

这很简单。将字符串映射到互斥锁,并使用互斥锁来保护此映射:

std::map<std::string, pthread_mutex_t *> mutexMap;
pthread_mutex_t mutexMap_lock = PTHREAD_MUTEX_INITIALIZER;

如果需要查找互斥锁,请先取mutexMap_lock锁。获得互斥锁后,删除锁定并缓存互斥锁指针,这样就不必继续引用此mutexMap争用点。