在多进程或多线程编程中,C++信号量 是一种非常重要的同步机制,尤其在 进程间通信(IPC)场景中。本文将带你从零开始理解并使用 POSIX信号量 实现 C++ 中的 IPC,即使你是编程小白,也能轻松上手!

信号量(Semaphore)是一种用于控制多个进程或线程对共享资源访问的计数器。它最早由荷兰计算机科学家 Dijkstra 提出,广泛应用于 C++ IPC 场景。
简单来说,信号量就像一个“许可证”系统:
在 Linux 系统中,有两种主要的信号量实现:
本文将重点介绍 POSIX信号量,因为它更易于理解和使用。
POSIX 信号量主要包含以下函数(需包含头文件 <semaphore.h>):
sem_open():创建或打开一个命名信号量;sem_wait():等待(P 操作),信号量减1;sem_post():释放(V 操作),信号量加1;sem_close():关闭信号量;sem_unlink():删除信号量(仅命名信号量)。下面我们将编写两个 C++ 程序:producer.cpp 和 consumer.cpp,它们通过一个命名信号量协调对共享内存的访问。
#include <iostream>#include <fcntl.h>#include <sys/stat.h>#include <semaphore.h>#include <unistd.h>int main() { // 创建或打开名为 "/my_sem" 的信号量,初始值为 0 sem_t* sem = sem_open("/my_sem", O_CREAT, 0644, 0); if (sem == SEM_FAILED) { perror("sem_open"); return 1; } std::cout << "Producer: 准备发送数据...\n"; sleep(2); // 模拟处理时间 std::cout << "Producer: 数据已准备好,通知消费者!\n"; sem_post(sem); // 释放信号量(+1) // 关闭并清理信号量 sem_close(sem); sem_unlink("/my_sem"); // 删除信号量 return 0;}#include <iostream>#include <fcntl.h>#include <semaphore.h>#include <unistd.h>int main() { // 打开已存在的信号量 "/my_sem" sem_t* sem = sem_open("/my_sem", 0); if (sem == SEM_FAILED) { perror("sem_open"); return 1; } std::cout << "Consumer: 等待数据...\n"; sem_wait(sem); // 等待信号量(-1,若为0则阻塞) std::cout << "Consumer: 收到数据!开始处理...\n"; sem_close(sem); return 0;}在终端中执行以下命令:
# 编译g++ -o producer producer.cpp -lpthreadg++ -o consumer consumer.cpp -lpthread# 先运行 consumer(它会阻塞等待)./consumer &# 再运行 producer./producer你会看到 consumer 先打印“等待数据”,然后 producer 运行后,consumer 继续执行并打印“收到数据!”。
/ 开头(如 /my_sem),这是 POSIX 标准要求;sem_close() 关闭信号量,避免资源泄漏;sem_unlink() 删除信号量;-lpthread,因为 POSIX 信号量依赖 pthread 库。通过本教程,你已经掌握了如何在 C++ 中使用 POSIX信号量 实现 进程间通信。信号量是解决并发问题的强大工具,尤其适用于生产者-消费者模型、资源池管理等场景。
记住,良好的同步机制是构建稳定、高效多进程应用的基础。现在,你可以尝试扩展这个例子,比如加入共享内存来传递实际数据,进一步提升你的 C++ IPC 技能!
关键词回顾:C++信号量、C++ IPC、进程间通信、POSIX信号量
本文由主机测评网于2025-12-20发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210305.html