-
Notifications
You must be signed in to change notification settings - Fork 385
namespace ipc::sync
mutouyun edited this page Dec 9, 2025
·
1 revision
进程间同步原语命名空间,包含用于跨进程同步的互斥锁、信号量和条件变量。
-
ipc::sync::mutex- 进程间互斥锁 -
ipc::sync::semaphore- 进程间信号量 -
ipc::sync::condition- 进程间条件变量
ipc::sync命名空间提供了与标准库同步原语类似的API,但支持跨进程使用。所有同步原语都支持命名方式,允许不同进程通过相同的名称共享同一个同步对象。
| 特性 | ipc::sync | std::sync | ipc::spin_lock/rw_lock |
|---|---|---|---|
| 进程间同步 | ✅ | ❌ | ❌ |
| 命名共享 | ✅ | ❌ | ❌ |
| 系统调用 | ✅ | ✅ | ❌ |
| 适用场景 | 跨进程 | 线程间 | 线程间(极短临界区) |
#include "libipc/mutex.h"
ipc::sync::mutex mtx("shared_mutex");
mtx.lock();
// 跨进程的临界区
mtx.unlock();#include "libipc/semaphore.h"
// 生产者
ipc::sync::semaphore sem("sem_name", 0);
sem.post(); // 发信号
// 消费者(另一个进程)
ipc::sync::semaphore sem("sem_name", 0);
sem.wait(); // 等待信号#include "libipc/condition.h"
#include "libipc/mutex.h"
ipc::sync::mutex mtx("mtx");
ipc::sync::condition cond("cond");
// 等待方
mtx.lock();
while (!ready) {
cond.wait(mtx);
}
mtx.unlock();
// 通知方(另一个进程)
mtx.lock();
ready = true;
cond.notify(mtx);
mtx.unlock();- 基于POSIX pthread机制
- 使用共享内存实现
- 支持robust mutex(自动处理死锁所有者)
- 基于Windows命名对象
- Mutex、Semaphore、Condition Variable API
- 自动处理进程终止清理
建议的命名规范:
- 使用描述性名称:
"database_lock"而非"lock1" - 添加应用前缀:
"myapp_database_lock" - 避免特殊字符,仅使用字母、数字和下划线
- Linux/FreeBSD上信号量名称会自动添加'/'前缀
所有同步原语都提供清理方法:
// 实例方法
mtx.clear();
// 静态方法
ipc::sync::mutex::clear_storage("mutex_name");
ipc::sync::semaphore::clear_storage("sem_name");
ipc::sync::condition::clear_storage("cond_name");重要:程序异常退出后,建议在重启时清理遗留的同步对象。
- 命名冲突:不同应用使用相同名称会共享同一个同步对象
-
死锁避免:
- 始终在同一线程/进程中配对加锁和解锁
- 避免嵌套锁,或保持固定的加锁顺序
- 使用超时避免永久阻塞
- 异常安全:使用RAII包装类(如自定义的lock_guard)
- 清理资源:程序退出前或重启时清理遗留的同步对象
- 权限问题:确保不同进程有权限访问共享的同步对象
-
ipc::sync::mutex- 互斥锁详细文档 -
ipc::sync::semaphore- 信号量详细文档 -
ipc::sync::condition- 条件变量详细文档 - mutex.h - Mutex头文件
- semaphore.h - Semaphore头文件
- condition.h - Condition头文件
- Platform Support - 平台支持文档