linux 共享内存 互斥量

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");
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值