实现多线程主要是封装成C++的thread(多线程)类
- 首先,我们需要加入头文件
<atlbase>
和<atlsync.h>
,因为在后续的使用过程中我们用到了atl类 - 写线程分以下几个步骤,创建线程,释放资源,线程工作函数,工作执行。根据以上步骤我们把他们封装在一个类中。
.h文件中的类大体结构
class CMultiThread
{
public:
bool Creater(); // 创建线程
bool UnInit(); // 释放资源
void NotifyDowork(const std::vector<int>& data);
static DWORD CALLBACK TestThread(LPVOID); // 线程函数,必须是静态函数
DWORD TestProc(); // 线程工作实现
private:
std::vector<int> m_data; // 同步数据
ATL::CEvent m_NotifyEvent; // 通知事件
HANDLE m_hThread; // 线程句柄
};
其中线程的句柄是HANDLE。
.cpp中bool Init(); // 创建线程
bool CMultiThread::Creater()
{
// 创建事件
BOOL bRet = m_NotifyEvent.Create(NULL, TRUE, FALSE, NULL);
if (!bRet) {
return false;
}
// 挂起的方式创建线程
m_hThread = CreateThread(NULL, 0, &CMultiThreadTest::TestThread, this, CREATE_SUSPENDED, NULL);
if (NULL == m_hThread) {
return false;
}
// 唤醒线程
ResumeThread(m_hThread);
return true;
}
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadID
);
参数的含义如下:
lpThreadAttrivutes:指向SECURITY_ATTRIBUTES的指针,用于定义新线程的安全属性,一般设置成NULL;
dwStackSize:分配以字节数表示的线程堆栈的大小,默认值是0;
lpStartAddress:指向一个线程函数地址。每个线程都有自己的线程函数,线程函数是线程具体的执行代码;
lpParameter:传递给线程函数的参数;
dwCreationFlags:表示创建线程的运行状态,其中CREATE_SUSPEND表示挂起当前创建的线程,而0表示立即执行当前创建的进程;
lpThreadID:返回新创建的线程的ID编号;
释放资源
bool CMultiThread::UnInit()
{
// 通知线程处理data的数据
if (m_NotifyEvent != NULL) {
m_NotifyEvent.Set();
}
if (m_hThread != NULL)
{
// 预留100ms让线程处理完数据,100ms是个估值
WaitForSingleObject(m_hThread, 100);
CloseHandle(m_hThread);
m_hThread = NULL;
}
return true;
}
线程主要工作内容函数
DWORD CALLBACK CMultiThread::TestThread(LPVOID lpParam)
{
if (lpParam == NULL) {
return 0;
}
CMultiThread* lpThis = reinterpret_cast<CMultiThread*>(lpParam);
return lpThis->TestProc();
}
DWORD CMultiThread::TestProc()
{
while (true)
{
// 每5s监听一次,秒数直接影响程序的性能
DWORD dwRet = WaitForSingleObject(m_NotifyEvent, 5000);
// 进入循环5s没有事件发生,不做任何处理
if (dwRet == WAIT_TIMEOUT) {
continue;
}
// 打印数组
for (unsigned int i = 0; i < m_data.size(); i++)
{
cout << m_data[i] << " ";
}
cout << endl;
// 重置事件
m_NotifyEvent.Reset();
}
return 0;
}
执行工作
void CMultiThread::NotifyDowork(const std::vector<int>& data)
{
m_data = data;
m_NotifyEvent.Set(); // 通知线程该做事情了!
}
然后是mian里执行了
int _tmain(int argc, _TCHAR* argv[])
{
CMultiThread multiThreadTest;
// 初始化失败
if (!multiThreadTest.Creater()) {
return 0;
}
srand(unsigned int(time(NULL)));
std::vector<int> data;
while (true)
{
data.clear();
// 产生10个随机数
for (int i = 0; i < 10; i++)
data.push_back(rand() % 1000);
// 通知多线程类执行工作
multiThreadTest.NotifyDowork(data);
Sleep(2000);
}
multiThreadTest.UnInit();
return 0;
}