#include <cstdlib>
#include <chrono>
#include <iostream>
#include <thread>

int p = 0;
int *q = nullptr;

void g()
{
    using namespace std::chrono_literals;

    std::cout << "g()" << std::endl;

    std::cout << "g(): p = 1" << std::endl;
    p = 1;

    std::this_thread::sleep_for(1s);

    
    if (q != nullptr) {
        std::cout << "g(): *q = 1" << std::endl;
        *q = 1;
    } else {
        std::cout << "g(): q == nullptr" << std::endl;
    }
}

void f()
{
    using namespace std::chrono_literals;

    std::cout << "f()" << std::endl;

    if (p == 0) {
        std::cout << "f(): first loop start" << std::endl;
        while (p == 0) { }  // Потенциально конечный
        std::cout << "f(): first loop end" << std::endl;
    }

    int i = 0;
    q = &i;
    std::cout << "f(): second loop start" << std::endl;
    while (i == 0) { }  // Потенциально конечный, хотя в условии только автоматическая пельменная
    std::cout << "f(): second loop end" << std::endl;
}

int main()
{
    using namespace std::chrono_literals;

    std::cout << "f() thread start" << std::endl;
    auto thr1 = std::thread(f);
    thr1.detach();
    std::this_thread::sleep_for(1s);

    std::cout << "g() thread start" << std::endl;
    auto thr2 = std::thread(g);
    thr2.detach();
    std::this_thread::sleep_for(2s);

    std::cout << "Done" << std::endl;
    
    std::_Exit(EXIT_SUCCESS);
}
