网站流量100g网站建设 应酷
322、循环队列、信号量、生产/消费者模型的源代码
 一、demo1.cpp
 // demo1.cpp,本程序演示循环队列的使用。
 #include "_public.h"
 int main()
 {
 using ElemType=int;
 squeue<ElemType,5> QQ;
 ElemType ee; // 创建一个数据元素。
 cout << "元素(1、2、3)入队。\n";
 ee=1; QQ.push(ee);
 ee=2; QQ.push(ee);
 ee=3; QQ.push(ee);
 cout << "队列的长度是" << QQ.size() << endl;
 QQ.printqueue();
 ee=QQ.front(); QQ.pop(); cout << "出队的元素值为" << ee << endl;
 ee=QQ.front(); QQ.pop(); cout << "出队的元素值为" << ee << endl;
 cout << "队列的长度是" << QQ.size() << endl;
 QQ.printqueue();
 cout << "元素(11、12、13、14、15)入队。\n";
 ee=11; QQ.push(ee);
 ee=12; QQ.push(ee);
 ee=13; QQ.push(ee);
 ee=14; QQ.push(ee);
 ee=15; QQ.push(ee);
 cout << "队列的长度是" << QQ.size() << endl;
 QQ.printqueue();
 }
 二、demo2.cpp
 // demo2.cpp,本程序演示基于共享内存的循环队列。
 #include "_public.h"
 int main()
 {
 using ElemType=int;
 // 初始化共享内存。
 int shmid=shmget(0x5005, sizeof(squeue<ElemType,5>), 0640|IPC_CREAT);
 if ( shmid ==-1 )
 {
 cout << "shmget(0x5005) failed.\n"; return -1;
 }
 // 把共享内存连接到当前进程的地址空间。
 squeue<ElemType,5> *QQ=(squeue<ElemType,5> *)shmat(shmid,0,0);
 if ( QQ==(void *)-1 )
 {
 cout << "shmat() failed\n"; return -1;
 }
 QQ->init(); // 初始化循环队列。
 ElemType ee; // 创建一个数据元素。
 cout << "元素(1、2、3)入队。\n";
 ee=1; QQ->push(ee);
 ee=2; QQ->push(ee);
 ee=3; QQ->push(ee);
 cout << "队列的长度是" << QQ->size() << endl;
 QQ->printqueue();
 ee=QQ->front(); QQ->pop(); cout << "出队的元素值为" << ee << endl;
 ee=QQ->front(); QQ->pop(); cout << "出队的元素值为" << ee << endl;
 cout << "队列的长度是" << QQ->size() << endl;
 QQ->printqueue();
 cout << "元素(11、12、13、14、15)入队。\n";
 ee=11; QQ->push(ee);
 ee=12; QQ->push(ee);
 ee=13; QQ->push(ee);
 ee=14; QQ->push(ee);
 ee=15; QQ->push(ee);
 cout << "队列的长度是" << QQ->size() << endl;
 QQ->printqueue();
 shmdt(QQ); // 把共享内存从当前进程中分离。
 }
 三、demo3.cpp
 // demo3.cpp,本程序演示用信号量给共享内存加锁。
 #include "_public.h" struct stgirl // 超女结构体。
 {
 int no; // 编号。
 char name[51]; // 姓名,注意,不能用 string。
 };
 int main(int argc,char *argv[])
 {
 if (argc!=3) { cout << "Using:./demo no name\n"; return -1; }
 // 第 1 步:创建/获取共享内存,键值 key 为 0x5005,也可以用其它的值。
 int shmid=shmget(0x5005, sizeof(stgirl), 0640|IPC_CREAT);
 if ( shmid ==-1 )
 {
 cout << "shmget(0x5005) failed.\n"; return -1;
 }
 cout << "shmid=" << shmid << endl;
 // 第 2 步:把共享内存连接到当前进程的地址空间。
 stgirl *ptr=(stgirl *)shmat(shmid,0,0);
 if ( ptr==(void *)-1 )
 {
 cout << "shmat() failed\n"; return -1;
 }
 // 创建、初始化二元信号量。
 csemp mutex;
 if (mutex.init(0x5005)==false)
 {
 cout << "mutex.init(0x5005) failed.\n"; return -1;
 }
 cout << "申请加锁...\n";
 mutex.wait(); // 申请加锁。
 cout << "申请加锁成功。\n";
 // 第 3 步:使用共享内存,对共享内存进行读/写。
 cout << "原值:no=" << ptr->no << ",name=" << ptr->name << endl; // 显示共享内存
 中的原值。
 ptr->no=atoi(argv[1]); // 对超女结构体的 no 成员赋值。
 strcpy(ptr->name,argv[2]); // 对超女结构体的 name 成员赋值。
 cout << "新值:no=" << ptr->no << ",name=" << ptr->name << endl; // 显示共享内存
 中的当前值。
 sleep(10);
 mutex.post(); // 解锁。
 cout << "解锁。\n";
 // 查看信号量 :ipcs -s // 删除信号量 :ipcrm sem 信号量 id
 // 查看共享内存:ipcs -m // 删除共享内存:ipcrm -m 共享内存 id
 // 第 4 步:把共享内存从当前进程中分离。
 shmdt(ptr);
 // 第 5 步:删除共享内存。
 //if (shmctl(shmid,IPC_RMID,0)==-1)
 //{
 // cout << "shmctl failed\n"; return -1;
 //}
 }
  
