Does Boost.Fiber automatically yield on network requests (if I understand correctly they yield the CPU during I/O), such as a database call over the network? I want to use it for setting up blocking database calls where I am inserting a lot of information and have a lot of small records that need to be inserted when they are received. My other choice would be libdill/libmill for the microthreading.
The general idea would be:
Do fibers work this way as I am envisioning it?
This is the simplified base structure for the code using RapidJSON and boost.fiber, but I'm getting the messages from the network (websocket):
inline
void doDatabaseCall( Document &msg ) {
//Get connection & do query with libpqxx
}
Document msg;
msg.Parse( "{\"myVar\": \"test\"}" );
Document msg2;
msg2.Parse( "{\"myVar\": \"test2\"}" );
boost::fibers::fiber f1( doDatabaseCall, msg);
boost::fibers::fiber f2( doDatabaseCall, msg2);
f1.join();
f2.join();
Does Boost.Fiber automatically yield on network requests (if I understand correctly they yield the CPU during I/O), such as a database call over the network?
No they do not.
What you seem to be looking for would be Boost Coroutines, combined with Boost Asio for the asynchronous IO. They will yield.
There are libraries for database operations that exploit Asio for asynchronous execution (e.g. Amy) or WebSockets (e.g. Boost Beast)