深圳it培训,win优化大师有用吗,内容营销价值,微信商城网站怎么做进程间同步可以使用互斥量mutex#xff08;互斥锁#xff09;、信号量和文件锁。
进程间同步使用信号量#xff1a;
int sem_init(sem_t *sem, int pshared, unsigned int value);
用于进程间同步此时第二个参数不能取0了#xff0c;取非0值用于进程间同步#xff0c;一…进程间同步可以使用互斥量mutex互斥锁、信号量和文件锁。
进程间同步使用信号量
int sem_init(sem_t *sem, int pshared, unsigned int value);
用于进程间同步此时第二个参数不能取0了取非0值用于进程间同步一般取1也可按照下述方法取值即PTHREAD_PROCESS_SHARED。
1进程间使用互斥量进行同步
在pthread_mutex_init初始化之前修改其属性为进程间共享。mutex的属性修改函数主要有以下几个
pthread_mutexattr_t mattr 类型用于定义mutex锁的属性
int pthread_mutexattr_init(pthread_mutexattr_t *attr); 初始化一个mutex属性对象
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared); 修改mutex属性参2pshared取值进程锁PTHREAD_PROCESS_SHARED 线程锁PTHREAD_PROCESS_PRIVATE mutex的默认属性即为线程锁进程间私有
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 销毁mutex属性对象 (而非销毁锁)
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 即将修改后的属性传入该函数即可产生一个进程锁。
//进程间使用互斥量来实现同步
#include fcntl.h
#include stdlib.h
#include string.h
#include pthread.h
#include sys/mman.h
#include sys/wait.hstruct mt {int num;pthread_mutex_t mutex;pthread_mutexattr_t mutexattr;
};int main(void)
{int i;struct mt *mm;pid_t pid;
/* 文件映射方式创建映射区int fd open(mt_test, O_CREAT | O_RDWR, 0777);ftruncate(fd, sizeof(*mm));mm mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);close(fd);unlink(mt_test);
*/ mm mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);memset(mm, 0, sizeof(*mm)); //初始化内存pthread_mutexattr_init(mm-mutexattr); //初始化mutex属性对象pthread_mutexattr_setpshared(mm-mutexattr, PTHREAD_PROCESS_SHARED); //修改属性为进程间共享pthread_mutex_init(mm-mutex, mm-mutexattr); //初始化一把mutex琐pid fork();if (pid 0) {for (i 0; i 10; i) {pthread_mutex_lock(mm-mutex);(mm-num);printf(-child----------num %d\n, mm-num);pthread_mutex_unlock(mm-mutex);sleep(1);}} else if (pid 0) {for ( i 0; i 10; i) {sleep(1);pthread_mutex_lock(mm-mutex);mm-num 2;printf(-------parent---num2 %d\n, mm-num);pthread_mutex_unlock(mm-mutex);}wait(NULL);}pthread_mutexattr_destroy(mm-mutexattr); //销毁mutex属性对象pthread_mutex_destroy(mm-mutex); //销毁mutexmunmap(mm,sizeof(*mm)); //释放映射区return 0;
}
[rootlocalhost 02_pthread_sync_test]# ./process_mutex
-child----------num 1
-------parent---num2 3
-child----------num 4
-------parent---num2 6
-child----------num 7
-child----------num 8
-------parent---num2 10
-------parent---num2 12
-child----------num 13
-------parent---num2 15
-child----------num 16
-child----------num 17
-------parent---num2 19
-child----------num 20
-------parent---num2 22
-child----------num 23
-------parent---num2 25
-child----------num 26
-------parent---num2 28
-------parent---num2 30