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

标签 c linux multithreading pthreads shared-memory

我正在尝试使用共享内存在两个进程(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/

相关文章:

c - double 和整数的求和和乘法不起作用

linux - linux 的等待队列中可以排队多少项?

linux - 如何对 SD 卡设置写/读保护?

java - 后台线程抛出 HibernateException - "No Hibernate Session bound to thread..."

java - 带有时间戳的 StacktraceElement

c - 从 MPI_Irecv() 访问数据

c - 链接器是复制函数的内容还是简单地链接到它?

c - 使用 C 操作指针

linux - 使用 Groovy 和 SED 命令用变量替换字符串

java - 多线程和递归一起