linux进程间互斥锁和条件变量

Ona ·
更新时间:2024-11-15
· 954 次阅读

设置进程间共享属性互斥锁和条件变量 将该互斥锁和条件变量放到共享内存中

public.h

#ifndef _PUBLIC_H #define _PUBLIC_H #include #include #include #include #include #include #include #include #include /* For mode constants */ #include /* For O_* constants */ typedef struct interaction { int id; char name[8]; pthread_cond_t cond; pthread_mutex_t mutex; }Interaction; extern Interaction* get_interaction(const char *filename); #endif // _PUBLIC_H

interaction.c

#include "public.h" Interaction* get_interaction(const char *filename) { Interaction *share_mem; int len = sizeof(Interaction); int fd = shm_open(filename, O_RDWR|O_CREAT|O_EXCL, 0777); if (fd > 0) { /**cond, &cond_attr); pthread_mutexattr_t mutex_attr; pthread_mutexattr_init(&mutex_attr); pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED); pthread_mutex_init(&share_mem->mutex, &mutex_attr); printf("mmap Interaction object(%p) ok\n", share_mem); } else { perror("ready"); fd = shm_open(filename, O_RDWR, 0777); /**< 其他进程已经初始化过了,这里不要再初始化 */ share_mem = (Interaction *)mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); printf("get Interaction object(%p) ok\n", share_mem); } close(fd); // shm_unlink("/test_share_mem"); return share_mem; }

signal.c

#include "public.h" int main() { Interaction *share_mem = get_interaction("test_share_mem"); while (1) { char buf[1024]; fgets(buf, sizeof(buf), stdin); strncpy(share_mem->name, buf, 7); printf("send condtion signal\n"); pthread_cond_signal(&share_mem->cond); } }

wait.c

#include "public.h" int main() { Interaction *share_mem = get_interaction("test_share_mem"); pthread_cond_t *cond = &share_mem->cond; pthread_mutex_t *mutex = &share_mem->mutex; while (1) { pthread_mutex_lock(mutex); pthread_cond_wait(cond, mutex); pthread_mutex_unlock(mutex); printf("get Interaction: %s\n", share_mem->name); } }
作者:XXDK141



Linux 互斥 条件变量 互斥锁 变量

需要 登录 后方可回复, 如果你还没有账号请 注册新账号