c++ map嵌套队列(队列嵌套结构体指针)ok
map中嵌套队列,队列中是结构体,有一个问题,结构体中的值不更新
#include <iostream>
#include <queue>
#include<map>
//#include <Windows.h>
using namespace std;
struct RevData{
int size;
char data[1000];
} recv_data;
map<string, queue<RevData>> amap;
HANDLE hMutex;
DWORD WINAPI Fun1(LPVOID)//创建多线程函数,函数返回值为DWORD WINAPI,一定要是这个,否则会出错
{
int index = 0;
while (true) {
char* aaa = "abcde";
WaitForSingleObject(hMutex, INFINITE);//获取等待资源,一直等待,知道获取"screen"资源后,才返回
queue<RevData> queue1 = amap[aaa];
RevData recvd;
recvd.size = index;
char* chard = "abcde";
memset(recvd.data, '\0', 1000);
memcpy(recvd.data, chard, 5);
//recvd.data = chard;
queue1.push(recvd);
amap[aaa] = queue1;
ReleaseMutex(hMutex);//释放资源独占函数
index++;
//Sleep(20);
}
}
DWORD WINAPI Fun2(LPVOID)//创建多线程函数,函数返回值为DWORD WINAPI,一定要是这个,否则会出错
{
while (true){
char* aaa = "abcde";
map<string, queue<RevData>>::iterator iter;
WaitForSingleObject(hMutex, INFINITE);//获取等待资源,一直等待,知道获取"screen"资源后,才返回
iter = amap.find(aaa);
if (iter != amap.end()) {
queue<RevData> queue1 = amap[aaa];
if (!queue1.empty()) {
RevData recv = queue1.front();
cout << recv.data << endl;
cout << recv.size << endl;
queue1.pop();
ReleaseMutex(hMutex);//释放资源独占函数
//Sleep(20);
}
}
else {
cout << "支线程1" << endl;
}
}
}
调用代码:
AllocConsole();
freopen("CONOUT$", "w", stdout);
hMutex = CreateMutex(NULL, FALSE, _T("screen"));
queue<RevData> queue1;
char* aaa = "abcde";
amap[aaa] = queue1;
HANDLE handle1 = CreateThread(NULL, 0, Fun1, NULL, 0, NULL);//创建多线程
//hMutex = CreateMutex(NULL, FALSE, "screen");//创建资源独占函数CreateMutex,该函数的功能是独占一个资源或者线程
CloseHandle(handle1);//释放线程
HANDLE handle2 = CreateThread(NULL, 0, Fun2, NULL, 0, NULL);//创建多线程
//hMutex = CreateMutex(NULL, FALSE, "screen");//创建资源独占函数CreateMutex,该函数的功能是独占一个资源或者线程
CloseHandle(handle2);//释放线程
问题原因:队列中是对象,等于号时,是复制对象,不是地址传递,queue<RevData> queue1 = amap[aaa];
这句代码中,queue1并不是map中的队列,而是map中队列的拷贝,所以pop也不是map中队列的pop,
如果不用指针,解决方法是再设置一下,代码如下:
DWORD WINAPI Fun2(LPVOID)//创建多线程函数,函数返回值为DWORD WINAPI,一定要是这个,否则会出错
{
while (true){
Sleep(20);
char* aaa = "abcde";
map<string, queue<RevData>>::iterator iter;
WaitForSingleObject(hMutex, INFINITE);//获取等待资源,一直等待,知道获取"screen"资源后,才返回
iter = amap.find(aaa);
if (iter != amap.end()) {
//queue<RevData> queue1 = amap[aaa];
if (!amap[aaa].empty()) {
RevData recv = amap[aaa].front();
cout << recv.data << endl;
cout << recv.size << endl;
int lenga = amap[aaa].size();
amap[aaa].pop();
int lenga2 = amap[aaa].size();
ReleaseMutex(hMutex);//释放资源独占函数
}
}
else {
cout << "支线程1" << endl;
}
}
}
队列里面是指针:
#include <iostream>
#include <queue>
#include<map>
//#include <Windows.h>
using namespace std;
struct RevData{
int size;
char data[1000];
} recv_data;
map<string, queue<RevData*>> amap;
HANDLE hMutex;
DWORD WINAPI Fun1(LPVOID)//创建多线程函数,函数返回值为DWORD WINAPI,一定要是这个,否则会出错
{
int index = 0;
while (true) {
char* aaa = "abcde";
WaitForSingleObject(hMutex, INFINITE);//获取等待资源,一直等待,知道获取"screen"资源后,才返回
queue<RevData*> queue1 = amap[aaa];
RevData recvd;
recvd.size = index;
char* chard = "abcde";
memset(recvd.data, '\0', 1000);
memcpy(recvd.data, chard, 5);
//recvd.data = chard;
queue1.push(&recvd);
amap[aaa] = queue1;
ReleaseMutex(hMutex);//释放资源独占函数
index++;
//Sleep(20);
}
}
DWORD WINAPI Fun2(LPVOID)//创建多线程函数,函数返回值为DWORD WINAPI,一定要是这个,否则会出错
{
while (true)
{
char* aaa = "abcde";
map<string, queue<RevData*>>::iterator iter;
WaitForSingleObject(hMutex, INFINITE);//获取等待资源,一直等待,知道获取"screen"资源后,才返回
iter = amap.find(aaa);
if (iter != amap.end()) {
queue<RevData*> queue1 = amap[aaa];
if (!queue1.empty()) {
RevData* recv = queue1.front();
cout << recv->data << endl;
cout << recv->size << endl;
queue1.pop();
ReleaseMutex(hMutex);//释放资源独占函数
//Sleep(20);
}
}
else {
cout << "支线程1" << endl;
}
}
}
AllocConsole();
freopen("CONOUT$", "w", stdout);
hMutex = CreateMutex(NULL, FALSE, _T("screen"));
queue<RevData*> queue1;
char* aaa = "abcde";
amap[aaa] = queue1;
HANDLE handle1 = CreateThread(NULL, 0, Fun1, NULL, 0, NULL);//创建多线程
//hMutex = CreateMutex(NULL, FALSE, "screen");//创建资源独占函数CreateMutex,该函数的功能是独占一个资源或者线程
CloseHandle(handle1);//释放线程
HANDLE handle2 = CreateThread(NULL, 0, Fun2, NULL, 0, NULL);//创建多线程
//hMutex = CreateMutex(NULL, FALSE, "screen");//创建资源独占函数CreateMutex,该函数的功能是独占一个资源或者线程
CloseHandle(handle2);//释放线程
下面是失败的,map中放队列指针,队列指针中放结构体指针
#include <iostream>
#include <queue>
#include<map>
#include <string>
#include <mutex>
//#include <Windows.h>
using namespace std;
struct RevData{
int size;
char data[1000];
} recv_data;
map<string, queue<RevData*>*> amap;
HANDLE hMutex;
DWORD WINAPI Fun1(LPVOID)//创建多线程函数,函数返回值为DWORD WINAPI,一定要是这个,否则会出错
{
int index = 0;
while (true) {
char* aaa = "abcde";
WaitForSingleObject(hMutex, INFINITE);//获取等待资源,一直等待,知道获取"screen"资源后,才返回
queue<RevData*>* queue1 = amap[aaa];
RevData recvd;
RevData *recvp;
char* chard = "abcde";
//memset(&recvd, '\0', sizeof(struct RevData));
strcpy(recvd.data, chard);
recvd.size = index;
//recvd.data = chard;
recvp = (RevData*)malloc(sizeof(RevData));
memcpy(recvp, &recvd, sizeof(RevData));
queue1->push(recvp);
index++;
Sleep(50);
//amap[aaa] = queue1;
ReleaseMutex(hMutex);//释放资源独占函数
}
}
DWORD WINAPI Fun2(LPVOID)//创建多线程函数,函数返回值为DWORD WINAPI,一定要是这个,否则会出错
{
while (true){
char* aaa = "abcde";
WaitForSingleObject(hMutex, INFINITE);//获取等待资源,一直等待,知道获取"screen"资源后,才返回
map<string, queue<RevData*>*>::iterator iter;
iter = amap.find(aaa);
if (iter != amap.end()) {
queue<RevData*>* queue1 = amap[aaa];
if (!queue1->empty()) {
RevData* recv = queue1->front();
cout << (*recv).data << endl;
cout << recv->size << endl;
int lenga = queue1->size();
queue1->pop();
int lenga2 = queue1->size();
}
}
else {
cout << "支线程1" << endl;
}
Sleep(50);
ReleaseMutex(hMutex);//释放资源独占函数
}
}
调用代码:
hMutex = CreateMutex(NULL, FALSE, _T("screen"));
queue<RevData*> queue1;
queue<RevData*>* queue2;
for (int i = 0; i < 10; i++) {
RevData recvD;
recvD.size = i;
strcpy(recvD.data, "hello");
RevData* recvp = (RevData*)malloc(sizeof(RevData));
memcpy(recvp, &recvD, sizeof(RevData));
queue1.push(recvp);// recvp);
//queue1.push(&recvD);
}
//queue<RevData*> queue1;
char* aaa = "abcde";
queue2 = (queue<RevData*>*)malloc(sizeof(queue<RevData*>));
memcpy(queue2, &queue1, sizeof(queue<RevData*>));
amap[aaa] = queue2;
HANDLE handle1 = CreateThread(NULL, 0, Fun1, NULL, 0, NULL);//创建多线程
//hMutex = CreateMutex(NULL, FALSE, "screen");//创建资源独占函数CreateMutex,该函数的功能是独占一个资源或者线程
CloseHandle(handle1);//释放线程
HANDLE handle2 = CreateThread(NULL, 0, Fun2, NULL, 0, NULL);//创建多线程
//hMutex = CreateMutex(NULL, FALSE, "screen");//创建资源独占函数CreateMutex,该函数的功能是独占一个资源或者线程
CloseHandle(handle2);//释放线程
c++ map嵌套队列(队列嵌套结构体指针)ok相关推荐
- c++队列指针 结构体指针
RevData中如果放的是对象数据,不是char* int,可以用如下方式: RevData *recvD =new RevData; recvD.size = i; strcpy(recvD.dat ...
- c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const
十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...
- C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例
C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...
- c语言嵌套结构体数组,第22节 C语言结构体之结构体嵌套、结构体指针与结构体数组的代码实现...
结构体 #include //第一步 struct Student { //学号 int no; //姓名 char name[20]; //性别 char sex[10]; //成绩 double ...
- C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,const变量使用)
C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,const变量使用) 目录 C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数, ...
- 【C++】结构体 - 定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体 const
文章目录 1. 定义和使用 2. 结构体数组 3. 结构体指针 4. 结构体嵌套结构体 5. 结构体做函数参数 6. 结构体 const 1. 定义和使用 结构体属于用户自定义的数据类型,允许用户存储 ...
- c++结构体总结(结构体定义,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体中 const使用场景)
看完b站黑马程序员之后的借鉴和笔记 1.什么是结构体,有什么作用? 在C/C++中,结构体是用户定义的数据类型.它可以把几种不同类型的数据项集合成结构体这样一个单一类型. 2. 结构体定义和使用 #i ...
- C++结构体 结构体定义和使用、结构体数组、结构体指针、结构体嵌套结构体、结构体做函数参数
C++结构体 第二章 C++结构体 1.结构体定义和使用 语法:struct 结构体名 { 结构体成员列表 }: 通过结构体创建变量的方式有三种: struct 结构体名 变量名 struct 结构体 ...
- C++_结构体指针_嵌套结构体_结构体做为函数参数_结构体值传递和指针传递---C++语言工作笔记026
然后我们来看结构体指针. 可以看到我们先去定义一个结构体 然后我们在main函数中,去声明一个结构体 s 然后我们定义一个指针 int *p = &s; 指向这个结构体变量. 这里要注意
最新文章
- android怎么搭建人脸库,OpenCV-2.4.6-android-sdk 人脸识别demo搭建
- 网络公司千千万,放心委托看这里!
- python装饰器常见问题_关于python装饰器的问题
- Loj#143-[模板]质数判定【Miller-Rabin】
- 2018/12/13
- MyBatis中resuleMap一对一和一对多属性字段映射
- 直接插入排序及优化(二分查找插入排序)
- 53 年 IT 老兵详谈传统网络到互联网的演变史
- UE4.26官方文档网页浏览录屏打包下载版
- 破解无线网络密码(蹭网教程
- 用acdsee制作html,ACDsee教程:ACDSee的HTML相册生成
- 淘宝钻石(信用)的等级
- SDN控制器Ryu、Floodlight、OpenDayLight的安装以及Mininet连接
- 部署无鱼工时系统,超详细教程,并成功部署
- flask 返回图片
- STM32蜂鸣器实例详解
- linux 替换多行内容,整理sed实战修改多行配置技巧
- python炫酷gui界面_python+tkinter+动画图片+爬虫(查询天气)的GUI图形界面设计
- 高仿支付宝首页头部动画
- cocos creator2.2.2益智教育游戏《夜幕降临》源码H5+安卓+IOS三端源码
热门文章
- php代码注释处理类库,php代码注释
- Design Pattern Template Method C
- php.ini 延迟,php超时报错Maximum execution time of 120 seconds exceeded in解决办法
- 专题 11 IPC之管道
- 曙光i620c20用户手册_曙光天阔I620-G20服务器技术白皮书.pdf
- matlab拟合未定义函数或变量,关于matlab的未定义函数或变量的问题
- mysql物理读和逻辑读,SQL Server中STATISTICS IO物理读和逻辑读的误区
- java 做计算器 百度云_用Java做一个简单的计算器
- 文末福利|云原生下Java的变化与趋势?程序员为什么不喜欢低代码?答案在这里!...
- Spring在Java领域的统治地位:86% 的Java开发者依赖它!