使用共享条件变量的多个进程中的IPC

时间:2015-02-09 08:21:25

标签: c linux multithreading pthreads shared-memory

我正在尝试使用共享内存在两个进程(Process1和Process2)之间实现 IPC ,而不是浪费cpu ,而不是浪费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 );

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


  

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


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

Process2无限期待。似乎信号丢失了。

我首先运行process2,然后运行process1以确保只有在process2开始等待之后才能传递process1信号。

我在哪里弄错了?

我正在使用ubuntu12.04和gcc。 任何有助于实现同样的帮助将受到高度赞赏。提前谢谢。

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

1 个答案:

答案 0 :(得分:0)

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

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