C++清晰步骤实现多线程

实现多线程主要是封装成C++的thread(多线程)类

  1. 首先,我们需要加入头文件<atlbase><atlsync.h>,因为在后续的使用过程中我们用到了atl类
  2. 写线程分以下几个步骤,创建线程,释放资源,线程工作函数,工作执行。根据以上步骤我们把他们封装在一个类中。
.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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值