您的位置:首页 > 编程语言 > C语言/C++

线程同步3 ------ 信号量在不同进程间同步的又一个实例

2017-12-15 11:23 337 查看
      以下实例通过信号量实现对临界资源的同步访问问题。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执行情况:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐