#include
#include
#include
#include
#include
#include
#include
#include
#include
#include #include
#include
#include
#include
#include #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define RCH1 0x52434831
#define RCH2 0x52434832
#define RCH3 0x52434833
#define RCH4 0x52434834
#define RCH5 0x52434835typedefstruct{ pthread_mutex_t mutex;
pthread_mutexattr_t mutexattr;
int flag ;
char buf[1];
}SHM;
创建共享内存并初始化锁:
#include"common.h"SHM *shm = NULL;
int main()
{ int id;
int key=getpid();
id=shmget(key,100,0666|IPC_CREAT);
//创建共享内存,注意读写权限
printf("id = %d\n",id);
char buf[]="abcdefghijkl";
shm=shmat(id,NULL,0);
//获取共享内存起始地址
pthread_mutexattr_init(&shm->mutexattr);
pthread_mutexattr_setpshared(&shm->mutexattr,PTHREAD_PROCESS_SHARED);
//第二个参数设置为进程锁,默认为线程锁
pthread_mutex_init(&shm->mutex,&shm->mutexattr);
memcpy(shm->buf,buf,sizeof(SHM));
shm->flag=0;
sleep(100);
shmdt(shm);
//与共享内存断开连接
shmctl(id,IPC_RMID,NULL);
//销毁共享内存}
【共享内存 3.0 进程锁 与 进程锁】访问共享内存并打印flag:
#include"common.h"SHM *shm = NULL;
int main(int argc,char*argv[])
{int id=atoi(argv[1]);
shm=shmat(id,NULL,0);
//获取共享内存起始地址 while(1){
pthread_mutex_lock(&shm->mutex);
//上锁
printf("增加前:buf = %s,flag =%d\n",shm->buf,shm->flag++);
sleep(1);
shm->flag--;
printf("增加后:buf = %s,flag =%d\n",shm->buf,shm->flag);
pthread_mutex_unlock(&shm->mutex);
//解锁
sleep(1);
}}
注意编译的时候需要 -lpthread。
如果不加上锁,打印的结果flag就会出现 0,1,2 ....这些值,
加上锁之后,打印的flag只能为0;