Skip to content

namespace ipc::sync

mutouyun edited this page Dec 9, 2025 · 1 revision

namespace ipc::sync

进程间同步原语命名空间,包含用于跨进程同步的互斥锁、信号量和条件变量。

主要类

  • 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();

平台实现

Linux / FreeBSD / QNX

  • 基于POSIX pthread机制
  • 使用共享内存实现
  • 支持robust mutex(自动处理死锁所有者)

Windows

  • 基于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 - 平台支持文档

Clone this wiki locally