1. 程式人生 > >c++ map巢狀佇列(佇列巢狀結構體指標)ok

c++ map巢狀佇列(佇列巢狀結構體指標)ok


map中巢狀佇列,佇列中是結構體,有一個問題,結構體中的值不更新

#include<iostream>

#include<queue>

#include<map>

//#include <Windows.h>

usingnamespace std;

structRevData{

int size;

char data[1000];

} recv_data;

map<string, queue<RevData>> amap;

HANDLE hMutex;

DWORDWINAPI 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);

}

}

DWORDWINAPI 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,

如果不用指標,解決方法是再設定一下,程式碼如下:

DWORDWINAPI 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>

usingnamespace std;

structRevData{

int size;

char data[1000];

} recv_data;

map<string, queue<RevData*>> amap;

HANDLE hMutex;

DWORDWINAPI 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);

}

}

DWORDWINAPI 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>

usingnamespace std;

structRevData{

int size;

char data[1000];

} recv_data;

map<string, queue<RevData*>*> amap;

HANDLE hMutex;

DWORDWINAPI 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);//釋放資源獨佔函式

}

}

DWORDWINAPI 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);//釋放執行緒