Я реализую многопоточную программу на C++ для платформы Linux, где мне нужна функциональность, похожая на WaitForMultipleObjects().C++: сценарий синхронизации потоков на платформе Linux
При поиске решения я заметил, что есть статьи, которые описывают, как реализовать функции WaitForMultipleObjects() в Linux с примерами, но эти примеры не удовлетворяют сценарию, который я должен поддерживать.
Сценарий в моем случае довольно прост. У меня есть процесс демона, в котором основной поток предоставляет метод/обратный вызов внешнему миру, например, в DLL. Код DLL не под моим контролем. Тот же основной поток создает новый поток «Thread 1». В потоке 1 должен выполняться вид бесконечного цикла, в котором он будет ждать события выключения (отключение демона), или он будет ждать события, доступного данным, через открытый метод/обратный вызов, упомянутый выше.
Короче говоря, поток будет ждать события выключения и события, имеющего доступ к данным, если если событие выключения сигнализируется о том, что ожидание будет удовлетворять, и цикл будет сломан или если будет передано событие с данными, то также ожидание будет удовлетворять, и поток будет выполняться обработка бизнеса.
В окнах кажется очень прямолинейным. Ниже приведен псевдословный код 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, у него есть совершенно другой механизм, где нам нужно регистрироваться для сигналов. Если сигнал о завершении достигнет, процесс узнает, что он вот-вот остановится, но до этого процесс должен ждать, пока работающий поток будет изящно выключен.
POSIX эквивалент WFMO - это 'select' /' poll'/'epoll'. Почти все в Linux - это нужный файловый дескриптор, и вы всегда можете заставить некоторые трубы действовать как ожидаемые события interthread. Итак, ваш обработчик сигнала просто напишет трубку, связанную с другой нитью, которая будет разбужена. Вы даже можете использовать сокет datagram или датаграмму FIFO как свою потокобезопасную очередь. –