我正在尝试使用共享内存在两个进程(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;}
答案 0 :(得分:0)
由于您所显示的代码并不明显,请让我说明一下:
您应该将互斥锁和条件变量放在共享内存中,以便通过共享内存使任何人都可以使用它们。在共享内存中放置指向它们的指针是不够的。