c++ 多線程 線程鎖與信號量使用,std::mutex,std::list,CreateSemaphore,CreateThrea
main.cpp
// ConsoleApplication1.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#include "pch.h"
#include <iostream>
#include <windows.h>
#include "dataanalyst.h"
DWORD WINAPI Thread_1(LPVOID param)
{
while (1) {
DWORD dwWait = WaitForSingleObject(hSM_1, INFINITE);
mutex1.lock();
char *p = list1.front();
list1.pop_front();
mutex1.unlock();
std::cout << "type 1 ,lenth: ";
std::cout << int(p[2]);
std::cout << "\n";
//todo
free(p);
}
}
DWORD WINAPI Thread_2(LPVOID param)
{
while (1) {
DWORD dwWait = WaitForSingleObject(hSM_2, INFINITE);
mutex2.lock();
char *p = list2.front();
list2.pop_front();
mutex2.unlock();
std::cout << "type 2 ,lenth: ";
std::cout << int(p[2]);
std::cout << "\n";
free(p);
}
}
int main()
{
//模擬數據 0x03時數據長度
char data1[6] = {0xcc,0x55,0x03,0x01,0x0d,0xda};
char data2[6] = {0xcc,0x55,0x03,0x02,0x0d,0xda};
HANDLE hSM_1 = CreateThread(NULL, 0, Thread_1, NULL, 0, NULL);
HANDLE hSM_2 = CreateThread(NULL, 0, Thread_2, NULL, 0, NULL);
DataAnalyst dataAnalyst;
Sleep(1000*10);
while (true)
{
//模擬發送速率
Sleep(1000);
char * p1 = (char*)malloc(sizeof(data1));
memcpy(p1, data1, sizeof(data1));
dataAnalyst.addData(p1);
p1 = (char*)malloc(sizeof(data2));
memcpy(p1, data2, sizeof(data2));
dataAnalyst.addData(p1);
}
}
dataanalyst.h
#pragma once
#include <list>
#include <mutex>
#include <iostream>
#include <Windows.h>
extern std::list<char*> list1;
extern std::mutex mutex1;
extern std::list<char*> list2;
extern std::mutex mutex2;
extern HANDLE hSM_1;
extern HANDLE hSM_2;
class DataAnalyst
{
public:
DataAnalyst();
~DataAnalyst();
void addData(char* data);
};
dataanalyst.cpp
#include "pch.h"
#include "dataanalyst.h"
std::list<char*> list1;
std::mutex mutex1;
std::list<char*> list2;
std::mutex mutex2;
HANDLE hSM_1 = CreateSemaphore(NULL, 0, 999, NULL);
HANDLE hSM_2 = CreateSemaphore(NULL, 0, 999, NULL);
DataAnalyst::DataAnalyst()
{
}
DataAnalyst::~DataAnalyst()
{
}
void DataAnalyst::addData(char* data)
{
if (data[0] == char(0xcc)&& data[1] == char(0x55))
{
if (data[3] == char(0x01))
{
mutex1.lock();
list1.push_back(data);
mutex1.unlock();
ReleaseSemaphore(hSM_1, 1, NULL);//+1
}
else if (data[3] == char(0x02))
{
mutex2.lock();
list2.push_back(data);
mutex2.unlock();
ReleaseSemaphore(hSM_2, 1, NULL);//+1
}
}
}
效果圖: