In this day and age, I would suggest to just make them async. Be careful of dispatching new work faster than they get processed.
In theory I would suggest std::future
but it is my understanding it has no "is result ready" call so I'm afraid you will have to go with std::thread.
Now, you should carefully approach threading but you don't have to be scared by them. In a certain sense, they don't introduce really new concepts in terms of data safety. Just try to figure out a minimal data set they need to work on and the minimal "interface".
SeanMiddletech reported below that it is possible to obtain a "is result ready call" by having a sleep-by-0-seconds call. I consider it a bit quirky but it sure will do. Go upvote that post.
EDIT: I have noticed WFP reply is more recent. Whoops. Go upvote that as well. Note: use the quote button, it gives notifications to the quoted person.