信号量
来源:互联网 发布:淘宝排行榜如何设置 编辑:程序博客网 时间: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");
}
互斥:生产者向缓冲区输送产品时,禁止消费者进入,同理,消费者从缓冲区取走产品时
,禁止生产者输送产品。
信号量:一组整型变量,为控制临界资源而产生的一个或一组计数器;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");
}
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- 信号量
- <>信号量
- 信号量
- 信号量
- 最大熵模型与最大似然概率
- php移除字符串的最后一位
- log device is empty
- Linux下部署项目
- S3C2440按键驱动之中断法
- 信号量
- SQL存储过程游标调用存储过程示例
- eclipse各个版本的区别
- hadoop命令大全
- Invalid command ‘RewriteEngine’ ubuntu 解决报错。
- java程序员应该了解的10个面向对象设计原则
- Unity3D 优化内置iOS Player
- 共享内存
- 注释驱动的 Spring cache 缓存介绍