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相关推荐

  1. c++队列指针 结构体指针

    RevData中如果放的是对象数据,不是char* int,可以用如下方式: RevData *recvD =new RevData; recvD.size = i; strcpy(recvD.dat ...

  2. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const

    十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...

  3. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  4. c语言嵌套结构体数组,第22节 C语言结构体之结构体嵌套、结构体指针与结构体数组的代码实现...

    结构体 #include //第一步 struct Student { //学号 int no; //姓名 char name[20]; //性别 char sex[10]; //成绩 double ...

  5. C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,const变量使用)

    C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,const变量使用) 目录 C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数, ...

  6. 【C++】结构体 - 定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体 const

    文章目录 1. 定义和使用 2. 结构体数组 3. 结构体指针 4. 结构体嵌套结构体 5. 结构体做函数参数 6. 结构体 const 1. 定义和使用 结构体属于用户自定义的数据类型,允许用户存储 ...

  7. c++结构体总结(结构体定义,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体中 const使用场景)

    看完b站黑马程序员之后的借鉴和笔记 1.什么是结构体,有什么作用? 在C/C++中,结构体是用户定义的数据类型.它可以把几种不同类型的数据项集合成结构体这样一个单一类型. 2. 结构体定义和使用 #i ...

  8. C++结构体 结构体定义和使用、结构体数组、结构体指针、结构体嵌套结构体、结构体做函数参数

    C++结构体 第二章 C++结构体 1.结构体定义和使用 语法:struct 结构体名 { 结构体成员列表 }: 通过结构体创建变量的方式有三种: struct 结构体名 变量名 struct 结构体 ...

  9. C++_结构体指针_嵌套结构体_结构体做为函数参数_结构体值传递和指针传递---C++语言工作笔记026

    然后我们来看结构体指针. 可以看到我们先去定义一个结构体 然后我们在main函数中,去声明一个结构体 s 然后我们定义一个指针 int *p = &s; 指向这个结构体变量. 这里要注意

最新文章

  1. android怎么搭建人脸库,OpenCV-2.4.6-android-sdk 人脸识别demo搭建
  2. 网络公司千千万,放心委托看这里!
  3. python装饰器常见问题_关于python装饰器的问题
  4. Loj#143-[模板]质数判定【Miller-Rabin】
  5. 2018/12/13
  6. MyBatis中resuleMap一对一和一对多属性字段映射
  7. 直接插入排序及优化(二分查找插入排序)
  8. 53 年 IT 老兵详谈传统网络到互联网的演变史
  9. UE4.26官方文档网页浏览录屏打包下载版
  10. 破解无线网络密码(蹭网教程
  11. 用acdsee制作html,ACDsee教程:ACDSee的HTML相册生成
  12. 淘宝钻石(信用)的等级
  13. SDN控制器Ryu、Floodlight、OpenDayLight的安装以及Mininet连接
  14. 部署无鱼工时系统,超详细教程,并成功部署
  15. flask 返回图片
  16. STM32蜂鸣器实例详解
  17. linux 替换多行内容,整理sed实战修改多行配置技巧
  18. python炫酷gui界面_python+tkinter+动画图片+爬虫(查询天气)的GUI图形界面设计
  19. 高仿支付宝首页头部动画
  20. cocos creator2.2.2益智教育游戏《夜幕降临》源码H5+安卓+IOS三端源码

热门文章

  1. php代码注释处理类库,php代码注释
  2. Design Pattern Template Method C
  3. php.ini 延迟,php超时报错Maximum execution time of 120 seconds exceeded in解决办法
  4. 专题 11 IPC之管道
  5. 曙光i620c20用户手册_曙光天阔I620-G20服务器技术白皮书.pdf
  6. matlab拟合未定义函数或变量,关于matlab的未定义函数或变量的问题
  7. mysql物理读和逻辑读,SQL Server中STATISTICS IO物理读和逻辑读的误区
  8. java 做计算器 百度云_用Java做一个简单的计算器
  9. 文末福利|云原生下Java的变化与趋势?程序员为什么不喜欢低代码?答案在这里!...
  10. Spring在Java领域的统治地位:86% 的Java开发者依赖它!