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