信号量

来源:互联网 发布:淘宝排行榜如何设置 编辑:程序博客网 时间:2024/06/04 19:09
信号完成进程控制。同步:禁止生产者向满的缓冲区输送产品,禁止消费者向空的缓冲区提取产品;
互斥:生产者向缓冲区输送产品时,禁止消费者进入,同理,消费者从缓冲区取走产品时
,禁止生产者输送产品。
信号量:一组整型变量,为控制临界资源而产生的一个或一组计数器;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");
}
原创粉丝点击