Print FooBar Alternately
                       
                
                
/*
#----------------------------------------------------------------------#
#                                                                      #
#  version 0.0.1                                                       #
#  https://leetcode.com/problems/print-foobar-alternately/submissions/ # 
#                                                                      #
#  Aleksiej Ostrowski, 2020                                            #
#                                                                      #
#  https://aleksiej.com                                                #
#                                                                      #
#----------------------------------------------------------------------#  
*/
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex m;
std::condition_variable cv;
int flag = 1;
void task1(const int n)
{
    int i = 1;
    for(;;) {
        std::unique_lock<std::mutex> lk(m);
        if (flag == 1) { 
           std::cout << "foo";
           i++;
           flag = 2;
           lk.unlock();
           cv.notify_all();
        } else {
           cv.wait(lk, []{return flag == 1;});
        }   
        if (i > n) return;
   }
}
void task2(const int n)
{
    int i = 1;
    for(;;) {
        std::unique_lock<std::mutex> lk(m);
        if (flag == 2) { 
           std::cout << "boo";
           i++;
           flag = 1;
           lk.unlock();
           cv.notify_all();
        } else {
           cv.wait(lk, []{return flag == 2;});
        }   
        if (i > n) return;
   }
}
int main()
{
    flag = 1;
    std::thread t1(task1, 3);
    std::thread t2(task2, 3);
    t1.join();
    t2.join();
}