Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ POCO - How to start a thread from the thread-pool while within a thread

I am using POCO default thread pool to start a event receiver thread which would listen for events. Once the event is received I need to process that event in a separate thread.

Here is what I am trying to do but i couldn't start the event processor in a new thread. The application hangs when i try to do so. I tried event printing the thread pool stats but the application hangs the moment I call default thread pool.

#include "Poco/ThreadPool.h"
#include "Poco/Runnable.h"
#include <iostream>
#include <thread>

class EventProcessor : public Poco::Runnable
{
public:
    void run()
    {
        // Event shall be processed here 
    }      
}; 

class EventReceiver : public Poco::Runnable
{
public:
    void run()
    {    
        // App hangs when i try to do this
        std::cout  << "Capacity: " <<   Poco::ThreadPool::defaultPool().capacity() << std::endl;
        
        EventProcessor eventProcessor;   
        Poco::ThreadPool::defaultPool().start(eventProcessor);
    }
};

int main(int argc, char** argv)
{
    EventReceiver eventReceiver;
    Poco::ThreadPool::defaultPool().start(eventReceiver);
    Poco::ThreadPool::defaultPool().joinAll();
    return 0;
}

like image 872
sundar saba Avatar asked Feb 02 '26 19:02

sundar saba


1 Answers

You are starting a thread with a reference to stack object, which is destroyed when the run() function returns; that creates undefined behavior.

A better way of doing this would be to have two threads (or tasks) that share a NotificationQueue. When you receive event, you enqueue notification to the queue in the receiver thread. The processing thread dequeues events and processes them. NotificationQueue is thread-safe, so no external locking is required between enqueuing and dequeuing.

You can see how to implement that in the NotificationQueue example; you will probably want the events enqueuing to happen in a thread other than main.

like image 120
Alex Avatar answered Feb 04 '26 10:02

Alex



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!