C++/Linux 线程一个版本搞定

跨平台全局变量管理与多线程同步:C++与Windows/MSC_VER实现
global.h

#include <queue>


#ifndef LPVOID
#define void*  LPVOID
#endif

class global
{
public:

#ifdef _MSC_VER
	HANDLE m_hBufThread;
	HANDLE m_hBufWeakUpSignal;
	CRITICAL_SECTION m_cs;


#else
	pthread_t  m_hBufThread;
	pthread_cond_t       m_hBufWeakUpSignal;
	pthread_mutex_t      m_cs;

#endif

queue<testStruct>* m_hqueue;


}



global.cpp


#include "stdafx.h"
#include "JtGlobal.h"

#if _MSC_VER
void jtProcessGlobalThread(LPVOID lpParam)
#else
void *jtProcessGlobalThread(LPVOID lpParam)
#endif
{
	JtGlobal* pGlobal = (JtGlobal*)lpParam;
	while (pGlobal->m_hBufThread)
	{
		JtEnterCriticalSection(&pGlobal->m_cs);
		if (pGlobal->m_hqueue->empty())
		{
			
#if _MSC_VER
				JtLeaveCriticalSection(&pGlobal->m_cs);
				WaitForSingleObject(pGlobal->m_hBufWeakUpSignal, INFINITE);
				ResetEvent(pGlobal->m_hBufWeakUpSignal);
				continue;
#else
				pthread_cond_wait(&pGlobal->m_hBufWeakUpSignal, &pGlobal->m_cs);
#endif				
			
		}
	
		JtLeaveCriticalSection(&pGlobal->m_cs);

		
			
	}
}

global::global()
{
#if _MSC_VER
	InitializeCriticalSection(&m_cs);//初始化
	
	m_hBufWeakUpSignal = CreateEvent(NULL, TRUE, TRUE, NULL);
	m_hBufThread = (HANDLE)_beginthread(jtProcessGlobalThread, 0, this);
	
#else
	pthread_mutex_init(&m_cs, NULL);//临界区

	pthread_cond_init(&m_hBufWeakUpSignal, NULL); //标志
	pthread_create(&m_hBufThread, NULL, jtProcessGlobalThread, this);  //创建线程
	
#endif

m_hqueue = new queue<testStruct>;
}




global::~global()
{
#if _MSC_VER
	if (m_hBufThread)
	{
		if (WaitForSingleObject(m_hBufThread, 100) == WAIT_TIMEOUT)
		{
			TerminateThread(m_hBufThread, 0);
		}
		m_hBufThread = NULL;
	}
	CloseHandle(m_hBufWeakUpSignal);
	DeleteCriticalSection(&m_cs);
	
#else
	pthread_join(m_hBufThread, NULL);
#endif

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值