pthread_mutex_lock()函数锁住由mutex指定的mutex 对象。如果mutex已经被锁住,调用这个函数的线程阻塞直到mutex可用为止。这跟函数返回的时候参数mutex指定的mutex对象变成锁住状态,同时该函数的调用线程成为该mutex对象的拥有者。
如果mutex 对象的type是 PTHREAD_MUTEX_NORMAL,不进行deadlock detection(死锁检测)。企图进行relock 这个mutex会导致deadlock. 如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,结果是不未知的。
如果mutex类型是 PTHREAD_MUTEX_ERRORCHECK,那么将进行错误检查。如果一个线程企图对一个已经锁住的mutex进行relock,将返回一个错误。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返回一个错误。
如果mutex类型是 PTHREAD_MUTEX_RECURSIVE,mutex会有一个锁住次数(lock count)的概念。当一个线程成功地第一次锁住一个mutex的时候,锁住次数(lock count)被设置为1,每一次一个线程unlock这个mutex的时候,锁住次数(lock count)就减1。当锁住次数(lock count)减少为0的时候,其他线程就能获得该mutex锁了。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返回一个错误。
如果mutex类型是 PTHREAD_MUTEX_DEFAULT,企图递归的获取这个mutex的锁的结果是不确定的。unlock一个不是被调用线程锁住的mutex的结果也是不确定的。企图unlock一个未被锁住的mutex导致不确定的结果。
/*
ftok函数生成键值
shmget函数创建共享内存空间
shmat函数获取第一个可用共享内存空间的地址
shmdt函数进行分离(对共享存储段操作结束时的步骤,并不是从系统中删除共享内存和结构)
shmctl函数进行删除共享存储空间
*/
command.h / client.c service.c
/*
ftok函数生成键值
shmget函数创建共享内存空间
shmat函数获取第一个可用共享内存空间的地址
shmdt函数进行分离(对共享存储段操作结束时的步骤,并不是从系统中删除共享内存和结构)
shmctl函数进行删除共享存储空间
*/
#include <pthread.h>
#define NAME_LEN 20
typedef struct {
char name[NAME_LEN];
int age;
pthread_mutex_t _mutex;
}ckx;
int sharememory(int ipc_size,int flag);
int create_ipc(int ipc_size);
int get_ipc(int ipc_size);
int sharememory(int ipc_size,int flag)
{
int id;
key_t key=ftok("/tmp",66);
if(key < 0)
{
printf("get key error\n");
return -1;
}
id = shmget(key,ipc_size,flag);
if(id < 0)
{
printf("get id error\n");
return -1;
}
return id;
}
int create_ipc(int ipc_size)
{
return sharememory(ipc_size,IPC_CREAT|IPC_EXCL|0666);
}
int get_ipc(int ipc_size)
{
return sharememory(ipc_size,IPC_CREAT|0666);
}
int destroy_sharememory(int id)
{
return shmctl(id,IPC_RMID,NULL);
}
#include<stdio.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>
#include "command.h"
int main()
{
int i=0;
ckx *pStruct;
int id = 0;
while(1)
{
printf("\n\n1.input data to sharememory\n2.get sharememory data\n\
3.destroy sharememory\ninput select:");
scanf("%d",&i);
if(i > 3 |i< 1)
{
printf("input error\n");
continue;
}
id = get_ipc(sizeof(ckx));
if(id < 0)
{
printf("get sharememory error\n");
break;
}
pStruct = (ckx *)shmat(id,NULL,0);
if(pStruct < 0)
{
printf("get sharememory addr error\n");
pStruct = NULL;
break;
}
if(pStruct->_mutex.__align == 0)
{
pthread_mutex_init(&pStruct->_mutex, NULL);
}
if(i == 1)
{
int x = 1;
while (x = pthread_mutex_trylock (&pStruct->_mutex) != 0)
{
printf("x = %d...", x);
}
//int x = pthread_mutex_lock (&pStruct->_mutex);
printf("lock x=%d \n", x);
char name[NAME_LEN];
int age=0;
fflush(stdin);
getchar();
printf("input name:");
gets(name);
printf("input age:");
scanf("%d",&age);
strcpy(pStruct->name,name);
pStruct->age = age;
printf("write success\n");
pthread_mutex_unlock(&pStruct->_mutex);
if(shmdt(pStruct) == -1)
{
printf("shmdt error\n");
}
id = 0;
}
if(i == 2)
{
printf("name:%s \t age:%d\n",pStruct->name,pStruct->age);
if(shmdt(pStruct) == -1)
{
printf("shmdt error\n");
break;
}
id = 0;
}
if(i == 3)
{
if(shmdt(pStruct) == -1)
{
printf("shmdt error\n");
break;
}
break;
}
}
if(id !=0)
{
if(destroy_sharememory(id)<0)
{
printf("destroy error\n");
}
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<stdlib.h>
#include "command.h"
int main()
{
int id=create_ipc(sizeof(ckx));
int i=0;
ckx *pStruct;
//
if(id < 0)
{
printf("create sharememory error\n");
return 0;
}
id = 0;
while(1)
{
printf("\n\n1.input data to sharememory\n2.get sharememory data\n\
3.destroy sharememory\ninput select:");
scanf("%d",&i);
if(i > 3 |i< 1)
{
printf("input error\n");
continue;
}
id = get_ipc(sizeof(ckx));
if(id < 0)
{
printf("get sharememory error\n");
break;
}
pStruct = (ckx *)shmat(id,NULL,0);
if(pStruct < 0)
{
printf("get sharememory addr error\n");
pStruct = NULL;
break;
}
if(pStruct->_mutex.__align == 0)
{
pthread_mutex_init(&pStruct->_mutex, NULL);
}
if(i == 1)
{
int x = 1;
while (x = pthread_mutex_trylock (&pStruct->_mutex) != 0)
{
printf("x = %d...", x);
}
//int x = pthread_mutex_lock (&pStruct->_mutex);
printf("lock x=%d \n", x);
char name[NAME_LEN];
int age=0;
printf("input name:");
fflush(stdin);
getchar();
gets(name);
printf("input age:");
scanf("%d",&age);
strcpy(pStruct->name,name);
pStruct->age = age;
printf("write success\n");
pthread_mutex_unlock(&pStruct->_mutex);
if(shmdt(pStruct) == -1)
{
printf("shmdt error\n");
}
id = 0;
}
if(i == 2)
{
printf("name:%s \t age:%d\n",pStruct->name,pStruct->age);
if(shmdt(pStruct) == -1)
{
printf("shmdt error\n");
break;
}
id = 0;
}
if(i == 3)
{
if(shmdt(pStruct) == -1)
{
printf("shmdt error\n");
break;
}
break;
}
}
if(id !=0)
{
if(destroy_sharememory(id)<0)
{
printf("destroy error\n");
}
}
}