linux 多进程下semaphore实现哲学家用餐模型

多进程下也就说先要开辟个共享存储区实现进程间IPC,然后存储区里放的是5把锁即可。
利用信号量机制实现。

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(void)
{
	int i;
	pid_t pid;

	sem_t *s;//共享区首地址
	s = mmap(NULL, sizeof(sem_t)*5, PROT_READ|PROT_WRITE, 
			MAP_SHARED|MAP_ANON, -1, 0);//共享区中放了5把锁
	if (s == MAP_FAILED) 
	{
		perror("fail to mmap");
		exit(1);
	}

	for (i = 0; i < 5; i++)
		sem_init(&s[i], 0, 1);  //信号量初值制定为1,信号量就变成了互斥锁

	for (i = 0; i < 5; i++)
		if ((pid = fork()) == 0)
			break;

	if (i < 5) 
	{				//子进程
		int l, r;
		srand(time(NULL));

		if (i == 4) 
			l = 0, r = 4;
		else
			l = i, r = i+1;
		while (1) {
			sem_wait(&s[l]);
			if (sem_trywait(&s[r]) == 0) 
			{
				printf(" %c is eating\n", 'A'+i);
				sem_post(&s[r]);
			}
			sem_post(&s[l]);
			sleep(rand() % 8);
		}
		exit(0);
	} 

	for (i = 0; i < 5; i++)
		wait(NULL);	//回收子进程

	for (i = 0; i < 5; i++)
		sem_destroy(&s[i]);

	munmap(s, sizeof(sem_t)*5);

	return 0;
}


linux 多进程下semaphore实现哲学家用餐模型_第1张图片

你可能感兴趣的:(Linux基础)