21xrx.com
2024-11-05 21:37:51 Tuesday
登录
文章检索 我的文章 写文章
C++子线程通知主线程结束运行
2023-07-05 22:16:58 深夜i     --     --
C++ 子线程 主线程 通知 结束运行

在 C++ 编程中,多线程是一种常用的技术,它可以将不同的任务分配给不同的线程去处理,从而提高程序的并发性和执行效率。但是,在多线程编程中,我们经常会遇到一个问题,那就是如何让主线程知道子线程已经结束运行。

一种常用的解决方案是使用信号量或事件(Semaphore or Event)。通过在子线程结束时发出一个信号或触发一个事件,可以使主线程从等待状态中唤醒,从而知道子线程已经结束运行。下面是一种基于事件的实现方式:

首先,在主线程中创建一个事件对象,然后将其传递给子线程。子线程在结束运行时,调用 SetEvent 函数来触发这个事件。主线程中的 WaitForSingleObject 函数依靠这个事件来等待子线程结束。具体实现代码如下:


// 主线程

HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, static_cast<void*>(&hEvent), 0, NULL);

WaitForSingleObject(hEvent, INFINITE);

// 子线程

DWORD WINAPI ThreadFunc(LPVOID lpParam) {

 HANDLE hEvent = *static_cast<HANDLE*>(lpParam);

 // 执行子线程任务

 SetEvent(hEvent); // 触发事件

 return 0;

}

在上述代码中,CreateEvent 函数用来创建一个事件对象,第二个参数表示初始状态为非终止状态(即未触发),第三个参数为手动重置模式,最后一个参数为事件对象的名称。CreateThread 函数用来创建子线程,并将事件对象的指针传递给子线程。WaitForSingleObject 函数用来等待事件的触发,它将阻塞主线程直到事件被触发或者超时。

总结来说,使用事件或信号量是一种简单有效的方法来解决子线程通知主线程结束的问题,在实际编程中建议多加利用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复