我正在为Linux平台实现多线程的C++程序,需要一个类似于WaitForMultipleObjects()功能的函数。
在寻找解决方案时,我发现有一些文章描述了如何在Linux中实现WaitForMultipleObjects()功能,并提供了示例代码,但这些示例并不能满足我的需求。
在我的情况下,场景非常简单。我有一个守护进程,在其中,主线程向外部(例如DLL)暴露了一个方法/回调。 DLL的代码不在我的控制之下。同样,主线程创建了一个名为“Thread 1”的新线程。线程1必须执行一种无限循环,等待关闭事件(守护进程关闭)或等待通过上述公开的方法/回调信号发送的可用数据事件。
简而言之,该线程将在关闭事件和数据可用事件上等待,如果关闭事件被触发,则等待会满足且循环将被中断,但是如果数据可用事件被触发,等待也会满足,线程将处理业务逻辑。
在Windows中,这似乎是非常直接的。以下是我场景的基于MS Windows的伪代码。
//**Main thread**
//Load the DLL
LoadLibrary("some DLL")
//Create a new thread
hThread1 = __beginthreadex(..., &ThreadProc, ...)
//callback in main thread (mentioned in above description) which would be called by the DLL
void Callbackfunc(data)
{
qdata.push(data);
SetEvent(s_hDataAvailableEvent);
}
void OnShutdown()
{
SetEvent(g_hShutdownEvent);
WaitforSingleObject(hThread1,..., INFINITE);
//Cleanup here
}
//**Thread 1**
unsigned int WINAPI ThreadProc(void *pObject)
{
while (true)
{
HANDLE hEvents[2];
hEvents[0] = g_hShutdownEvent;
hEvents[1] = s_hDataAvailableEvent;
//3rd parameter is set to FALSE that means the wait should satisfy if state of any one of the objects is signaled.
dwEvent = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);
switch (dwEvent)
{
case WAIT_OBJECT_0 + 0:
// Shutdown event is set, break the loop
return 0;
case WAIT_OBJECT_0 + 1:
//do business processing here
break;
default:
// error handling
}
}
}
我希望能在Linux上实现相同的功能。据我所知,当涉及到Linux时,它有完全不同的机制,需要我们注册信号。如果终止信号到达,进程将会知道它即将关闭,但在此之前,进程必须等待运行中的线程优雅地关闭。
select
/poll
/epoll
。在Linux中,几乎所有的东西都是可等待的文件描述符,您可以始终创建一些管道作为可等待的线程间事件。因此,您的信号处理程序只需写入连接到另一个线程的管道,该线程将被唤醒。您甚至可以使用数据报套接字或数据报FIFO作为线程安全队列。 - Ben Voigt