【发布时间】: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