c++ 多線程 線程鎖與信號量使用,std::mutex,std::list,CreateSemaphore,CreateThrea

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

}


效果圖: 

 

代碼資源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章