Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct WorkingQueue{
- WorkingQueue()=default;
- void push(std::function<void()> task){
- std::lock_guard<std::mutex> lock{mutex};
- queue.push(std::move(task));
- }
- std::optional<std::function<void()>> popIfNotEmpty(){
- std::lock_guard<std::mutex> lock{mutex};
- if(queue.empty()){
- return std::nullopt;
- }
- auto task = queue.front();
- queue.pop();
- return task;
- }
- bool empty(){
- std::lock_guard<std::mutex> lock{mutex};
- return queue.empty();
- }
- mutable std::mutex mutex;
- std::queue<std::function<void()>> queue;
- };
- int main(){
- WorkingQueue queue;
- std::atomic<bool> stopFlag{false};
- auto f = std::async(std::launch::async, [&queue, &stopFlag](){
- while(!stopFlag || !queue.empty()){
- auto task = queue.popIfNotEmpty();
- if(task){
- (*task)();
- }
- }
- });
- auto sp = std::make_shared<int>(5);
- queue.push([sp](){
- std::cout << *sp;
- });
- stopFlag = true;
- f.get();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement