信号量

信号完成进程控制。同步:禁止生产者向满的缓冲区输送产品,禁止消费者向空的缓冲区提取产品;
互斥:生产者向缓冲区输送产品时,禁止消费者进入,同理,消费者从缓冲区取走产品时
,禁止生产者输送产品。
信号量:一组整型变量,为控制临界资源而产生的一个或一组计数器;P操作申请资源,信号值减1;V操作释 
        放资源,信号量加1
信号量控制:
semctl(semid, semnu, GETVAL)
semctl(semid, semnu, GETPID)
semid_ds semidbuf;
semctl(semid, semnu, IPC_STAT, &semidbuf);
unsigned short array[]={1,2,3,4,5};
semctl(semid, semnu, SETALL, array);
#include <iostream>
#include <sys/sem.h>
using namespace std;


#define VERIFY(a, b)\
  if(a)\
cout<<b<<" fail"<<endl;\
else\
cout<<b<<"  success"<<endl;


void main(int argc, char* argv)
{
unsigned short array[100];
struct semid_ds ds;
int semid, index, i;


if(argc != 4)
exit(-1);
semid = atoi(argv[1]);
index = atoi(argv[2]);


if(argv[3][0] == 'c')
{
VERIFY(semget(semid, index, IPC_CREAT|IPC_EXCL|0777)<0, "create sem");
}
else
if(argv[3][0] == 'd')
{
VERIFY(semctl(semid, 0, IPC_RMID)<0, "delete sem");
}
else
if(argv[3][0] == 'v')
{
cout<<"T ID INDEX SEMVAL SEMPID SEMNCNT SEMZCNT"<<endl;
cout<<semid<<"  "<<index<<" "<<semctl(semid, index, GETVAL)<<"  
"<<semctl(semid, index, GETPID)<<endl;
}
else
if(argv[3][0] == 'a')
{
VERIFY(semctl(semid, index, GETALL, array)<0, "get all");
for(i=0; i<ds.sem_nsems; ++i)
cout<<"sem no "<<i<<"  "<<array[i]<<endl;
}
else
VERIFY(semctl(semid, index, SETVAL, atoi(argv[3]))<0, "set 
sem");

}




生产者---消费者:第一步利用信号量控制函数创建信号量,然后赋值;第二步执行生产消费
producer.cc
#inlcude <iostream>
#include <sys/sem.h>
using namespace std;

#define VERIFY(a,b)\
if(a)\
{\
cout<<b<<" fail"<<endl;\
}\
else\
cout<<b<<"  success"<<endl;

void main()
{
int semid;
VERIFY((semid=semget(1000, 2, 0777))<0, "open sem 1000");
struct sembuf sb;
sb.sem_num = 0;//第零个信号量,生产者
sb.sem_op = -1;
sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
VERIFY(semop(semid, &sb, 1)<0, "p sem 1000:0))");
cout<<getpid()<<" producing...."<<endl;
sleep(1);
cout<<getpid()<<" produced"<<endl;


sb.sem_nu = 1;
sb.sem_op = 1;
sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT;
VERIFY(semop(semid, &sb, 1)<0, "v sem 1000:0");
}




consumer.cc
#include <iostream>
#include <sys/sem.h>
using namespace std;


int main(int argc, char* argv[])
{
int semid;
struct sembuf sb;


VERIFY((semid=semget(1000, 2, 0777))<0, "open sem 1000");
sb.sem_num = 1;
sb.sem_op = -1;
sb.sem_flg= sb.sem_flg & ~IPC_NOWAIT;
VERIFY(semop(semid, &sb, 1)<0, "p sem 1000:1");
cout<<getpid<<"  consuming..."<<endl;
sleep(1);
cout<<getpid()<<" consumed"<<endl;


sb.sem_num = 0;
sb.sem_op = 1;
sb.sem_flg= sb.sem_flg & ~IPC_NOWAIT<<endl;
VERIFY(semop(semid, &sb, 1)<0, " v sem 1000:1");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值