This question comes from:
C++11 thread doesn't work with virtual member function
As suggested in a comment, my question in previous post may not the right one to ask, so here is the original question:
I want to make a capturing system, which will query a few sources in a constant/dynamic frequency (varies by sources, say 10 times / sec), and pull data to each’s queues. while the sources are not fixed, they may add/remove during run time.
and there is a monitor which pulls from queues at a constant freq and display the data.
So what is the best design pattern or structure for this problem.
I’m trying to make a list for all the sources pullers, and each puller holds a thread, and a specified pulling function (somehow the pulling function may interact with the puller, say if the source is drain, it will ask to stop the pulling process on that thread.)
Unless the operation where you query a source is blocking (or you have lots of them), you don’t need to use threads for this. We could start with a
Producerwhich will work with either synchronous or asynchronous (threaded) dispatch:Now we can derive from this
Producerand just implement thequerymethod in each subtype. You can setpoll_intervalin the constructor and leave it alone, or change it on every call toquery. There’s your general producer component, with no dependency on the dispatch mechanism.This is a quick sketch of a simple dispatcher that would run your producer in a thread, polling it however often you ask it to. Note that passing produced values back to the owner isn’t shown, because I don’t know how you want to access them.
Also note I haven’t synchronized access to the shutdown flag – it should probably be atomic, but it might be implicitly synchronized by whatever you choose to do with the produced values.
With this organization, it’d also be easy to write a synchronous dispatcher to query multiple producers in a single thread, for example from a select/poll loop, or using something like Boost.Asio and a deadline timer per producer.