gpt4 book ai didi

c - 使用共享条件变量的多个进程之间的 IPC

转载 作者:太空狗 更新时间:2023-10-29 11:21:59 24 4
gpt4 key购买 nike

我正在尝试使用共享内存在两个进程(Process1 和 Process2)之间实现 IPC,在等待轮到它时也不会浪费 cpu。它基本上是在多进程场景中使用条件变量

虽然我能够在父子场景中做到这一点,但无法做到两个单独的进程(process1 和 process2)场景。

这是我在亲子场景中所做的。

****使用 PTHREAD_PROCESS_SHARED 标志创建了 mptr(共享互斥锁)和 cvptr(条件变量),****

pthread_cond_t *cvptr;    //Condition Variable Pointer
pthread_condattr_t cattr; //Condition Variable Attribute
pthread_mutex_t *mptr; //Mutex Pointer
pthread_mutexattr_t matr; //Mutex Attribute

int shared_mem_id; //shared memory Id
int *mp_shared_mem_ptr; //shared memory ptr -- pointing to mutex
int *cv_shared_mem_ptr; //shared memory ptr -- pointing to condition variable



// Setup Mutex
rtn = pthread_mutexattr_init(&matr);
rtn = pthread_mutexattr_setpshared(&matr,PTHREAD_PROCESS_SHARED);
rtn = pthread_mutex_init(mptr, &matr);


//Setup Condition Variable
rtn = pthread_condattr_init(&cattr);
pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED));
pthread_cond_init(cvptr, &cattr);

从父进程发送信号

sleep(2);
pthread_cond_signal( cvptr ); // send signal to child process

并在子进程中等待信号。

pthread_cond_wait( cvptr, mptr );

根据条件变量的属性,当 child 等待轮到它时,它不会浪费任何 CPU 周期。


To make sure, parent must send signal only after child starts waiting for signal, sleep(2) is added before pthread_cond_signal( cvptr );


虽然我在两个进程场景中使用相同的概念,但进程 2 没有从进程 1 获得任何信号。

Process2 正在无限等待。似乎信号丢失了。

我首先运行 process2,然后运行 ​​process1 以确保 process1 信号必须仅在 process2 开始等待后才被传递。

我哪里出错了?

我正在使用 ubuntu12.04 和 gcc。任何帮助实现相同目标的帮助都将受到高度赞赏。提前致谢。

注意:我能够使用简单的共享内存概念在多个进程之间进行 IPC,其中最初 shared_variable 值 = 0 并且 process1 使其变为 1 以通知 process2 开始其工作,然后 process2更改 shared_variable =0 并继续。该解决方案在等待共享变量的更新值继续工作时实际上浪费了 CPU。像 while (shared_stuff->written_by_you == 1) {do nothing;}

最佳答案

由于您显示的代码并不明显,所以让我说明一下:

你应该把互斥体和条件变量放在共享内存中,让任何人都可以通过共享内存使用它们。将指向它们的指针放在共享内存中是不够的。

关于c - 使用共享条件变量的多个进程之间的 IPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28405461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com