線程同步3 ------ 信號量在不同進程間同步的又一個實例

      以下實例通過信號量實現對臨界資源的同步訪問問題。server程序創建一個信號集,並對信號量循環減1,相當於分配資源。而client在執行時首先檢查信號量,如果大於0代表有資源可用,就繼續執行。如果信號量小於0代表資源已經分配完畢,進程client退出。

server.c

//server.c

#include <sys/types.h>
#include <linux/sem.h>

#define MAX_RESOURCE	5

int main(void)
{
	key_t		key;
	int		semid;
	struct sembuf	sbuf = {0, -1, IPC_NOWAIT};
	union semun	semopts;

	if ((key = ftok(".", 's')) == -1)
	{
		perror ("ftok error!\n");
		exit (1);
	}

	if ((semid = semget (key,1,IPC_CREAT|0666)) == -1)
	{
		perror ("semget error!\n");
		exit (1);
	}

	semopts.val = MAX_RESOURCE;
	if (semctl (semid,0,SETVAL, semopts) == -1)
	{
		perror ("semctl error!\n");
		exit (1);
	}

	while (1)
	{
		if(semop(semid, &sbuf, 1) == -1)
		{
			perror ("semop error!\n");
			exit (1);
		}
		sleep (3);
	}

	exit (0);
}

//client.c

#include <sys/types.h>
#include <linux/sem.h>

int main(void)
{
	key_t		key;
	int		semid, semval;
	union semun	semopts;

	if((key = ftok (".",'s')) == -1)
	{
		perror ("ftok error!\n");
		exit (1);
	}

	if((semid = semget (key, 1, IPC_CREAT | 0666)) == -1)
	{
		perror ("semget error!\n");
		exit (1);
	}

	while(1)
	{
		if ((semval = semctl(semid, 0, GETVAL, 0)) == -1)
		{
			perror ("semctl error!\n");
			exit (1);
		}
		if (semval > 0)
		{
			printf ("Still %d resources can be used\n", semval);
		}
		else
		{
			printf ("No more resources can be used!\n");
			break;
		}

		sleep (3);
	}
	
	exit (0);
}

      打開兩個shell終端,分別執行server和client兩個程序。以下是2個程序的執行結果。

server執行情況:



client執行情況:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章