C++学习笔记(45)

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 name51; // 姓名,注意,不能用 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(argv1); // 对超女结构体的 no 成员赋值。

strcpy(ptr->name,argv2); // 对超女结构体的 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;

//}

}

相关推荐
sensen_kiss24 分钟前
CPT304 SoftwareEngineeringII 软件工程 2 Pt.8 软件测试 (Software Testing)(上)
学习·软件工程
力学与人工智能26 分钟前
PPT分享 | 洛桑联邦理工学院魏震:深度几何学习在工业设计优化中的应用
学习·优化·工业设计·深度几何学习·洛桑联邦理工学院
为何创造硅基生物1 小时前
独占指针的创建std::make_unique 本身自带堆出现
c++
kyle~2 小时前
ROS 2 与 Isaac Sim 联合仿真(一)体系架构、环境选型与基础通信闭环
c++·机器人·nvidia·仿真·ros2
努力努力再努力wz2 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
八解毒剂2 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
sensen_kiss2 小时前
CPT304 SoftwareEngineeringII 软件工程 2 Pt.9 软件测试 (Software Testing)(下)
学习·软件工程
wu_ye_m2 小时前
学习c语言第35天 函数声明和定义
c语言·开发语言·学习
清辞8533 小时前
Coze从入门到实战---第一、二章
大数据·人工智能·学习·语言模型
起床困难户5753 小时前
条款20:协助完成返回值优化
c++