我有一个家庭作业项目,需要创建一个STATIC库来提供对几个命名管道的相互访问。
这些管道用于使用库和服务器在各种客户端之间进行通信。
现在,假设我想使用pthread互斥量;我怎么能实现这一目标?进程如何知道哪个是存储互斥锁的共享内存区域?谁应该要求这个记忆区?服务器不能,因为它需要库本身提供互斥。
感谢asveikau,我提出了这个问题:
#define SHARED 1
#define MUTEX 1
int main() {
sem_t* mutex = sem_open("mutex", O_CREAT);
sem_init(mutex, SHARED, MUTEX);
fork(), fork(), fork();
sem_wait(mutex);
int i;
for(i = 0; i < 10; i++)
printf("process %d %d\n", getpid(), i), fflush(stdout);
sem_post(mutex);
}
从输出中确实似乎解决了我的问题。
谢谢大家。
答案 0 :(得分:1)
我把它作为评论,但我认为值得回答。
正如其他人所说,pthread互斥体不是跨进程的。你需要的是一个“命名的互斥体”。您可以使用sem_open
创建一个跨进程信号量,并将其初始计数为1.在这种情况下,sem_wait
变为“互斥锁定”,sem_post
变为“互斥锁解锁”。
请注意sem_open
虽然是POSIX的一部分,但并未得到普遍支持。我相信它可以在Linux和Mac OS X上运行。如果你关心它可能是Solaris(这些天你可能不关心)。我知道在OpenBSD上它总是失败ENOSYS
。 YMMV。