珂黛丽,李嫣提醒爸戴口罩,hp甜美生活
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/shm.h> #include <pthread.h> #include <sys/wait.h> int main(){ pthread_mutex_t *m; pthread_mutexattr_t mat; int shmid; pid_t pid; shmid = shmget(ipc_private, sizeof(pthread_mutex_t), 0600); if(shmid < 0){ perror("shmget"); return 1; } m = (pthread_mutex_t*)shmat(shmid, null, 0); //准备设定mutex的attribute pthread_mutexattr_init(&mat); //利用mutex进行进程间的通信 //底下这句没有的话,这个mutex只在本进程间有作用 if(pthread_mutexattr_setpshared(&mat, pthread_process_shared) != 0){ perror("pthread_mutexattr_setpshared"); return 1; } pthread_mutex_init(m, &mat); pid = fork(); printf("[%s] before pthread_mutex_lock()\n", pid == 0 ? "child" : "parent"); if(pthread_mutex_lock(m) != 0){ perror("pthread_mutex_lock"); return 1; } printf("[%s] press enter\n", pid == 0 ? "child" : "parent"); getchar(); if(pthread_mutex_unlock(m) != 0){ perror("pthread_mutex_unlock"); return 1; } printf("[%s] after pthread_mutex_lock()\n", pid == 0 ? "child" : "parent"); shmdt(m); if(pid != 0){ wait(null);//wait child process to complete printf("[%s] after wait()\n", pid == 0 ? "child" : "parent"); //delete shared memery if(shmctl(shmid, ipc_rmid, null) != 0){ perror("shmctl"); return 1; } } return 0; }
编译方法:
g++ -g process-41-pthread-mutex.cpp -std=c++11 -pthread
运行结果:
[parent] before pthread_mutex_lock() [parent] press enter [child] before pthread_mutex_lock() 敲回车 [parent] after pthread_mutex_lock() [child] press enter 敲回车 [child] after pthread_mutex_lock() [parent] after wait()
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论