双线程FunProc1与FunProc2共享数据,数据用类封装。共享数据在读写时需要上锁,只有解锁进入临界区才能操作共享数据。FunProc1与FunProc2类似于产生者与消费者的关系,如果FunProc1(sleep(t1))与FunProc2(sleep(t2))两个线程睡眠时间不一样,输出结果会有差别。
#include <iostream>
#include <queue>
#include <windows.h>
#include <mutex>
using namespace std;
class Node
{
public:
int ID;
};
int i = 0;
class RunData
{
private:
queue<Node> m_q;
std::mutex m_mtx;
public:
RunData(){}
void GetNode(Node &rsnode)
{
m_mtx.lock();
if (m_q.empty())
{
Node node;
node.ID = -1;
rsnode = node;
}
else
{
Node node = m_q.front();
rsnode = node;
m_q.pop();
}
m_mtx.unlock();
}
void AddQ(Node node)
{
m_mtx.lock();
m_q.push(node);
m_mtx.unlock();
}
int getSize()
{
return m_q.size();
}
};
DWORD WINAPI FunProc1(LPVOID lpParameter)
{
RunData* data = (RunData *)lpParameter;
Node temp;
while (true)
{
i++;
temp.ID = i;
data->AddQ(temp);
Sleep(100);
}
}
DWORD WINAPI FunProc2(LPVOID lpParameter)
{
RunData* data = (RunData *)lpParameter;
while (true)
{
Node node;
data->GetNode(node);
cout << node.ID << endl;
Sleep(80);
}
}
int main()
{
MSG msg;
int itemp;
HANDLE hThread1;
HANDLE hThread2;
RunData data;
hThread1 = CreateThread(NULL, 0, FunProc1, (LPVOID)&data, 0, NULL);
hThread2 = CreateThread(NULL, 0, FunProc2, (LPVOID)&data, 0, NULL);
while ((itemp = GetMessage(&msg, NULL, NULL, NULL)) && (itemp != 0) && (-1 != itemp))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}