【问题标题】:IPC among multiple process using shared condition variable使用共享条件变量的多个进程之间的 IPC
【发布时间】:2015-04-08 22:30:59
【问题描述】:

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

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

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

****使用 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 );

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


为了确保父母必须在孩子开始等待后才发送信号 对于信号,在pthread_cond_signal(cvptr)之前添加sleep(2)


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

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 linux multithreading pthreads shared-memory


    【解决方案1】:

    由于从您显示的代码中并不明显,让我声明一下:

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

    【讨论】:

      猜你喜欢
      • 2019-05-28
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2012-07-22
      • 1970-01-01
      • 2022-08-14
      相关资源
      最近更新 更多