przykład użycia condition_variable działający w 1 kompilatorze a innym nie

0

Witam
W visualu działa a w onlinegdb nie. Nie widzę co może być źle.

#include <iostream>
#include <memory>
#include <thread>
#include <initializer_list>
#include <algorithm>
#include <vector>
#include <mutex>
#include <memory>
#include <condition_variable>

using namespace std;
condition_variable var;

void watek(mutex& mut)
{
    unique_lock<mutex> guard(mut); //to mi domyslnie lokuje mutex bez 2-ego parametru jao std::defer
    var.wait(guard); //ale to na wstępie robi mi unlocka i czeka na notify
    cout << this_thread::get_id() << " start" << endl;
    cout << this_thread::get_id() << " end" << endl;
}

int main()
{
    thread watki[10];
    mutex mut;
    for(int i = 0; i<10; ++i)
        watki[i] = thread(watek, ref(mut));
        
    mut.lock(); //de fakto tego nawet nie potrzebuje
    cout << "koniec towrzenia" << endl;
    var.notify_all();
    mut.unlock();  //tego też nie
 
    
    for(int i = 0; i<10; ++i)
        if(watki[i].joinable())
            watki[i].join();

    return 0;
}
2

Nie masz synchronizacji między wejściem w wait i notify_all, więc, pewnie wypuszczasz notyfikację zanim wszystkie wątki zaczną czekać.

#include <atomic>
#include <iostream>
#include <memory>
#include <thread>
#include <initializer_list>
#include <algorithm>
#include <vector>
#include <mutex>
#include <memory>
#include <condition_variable>

using namespace std;
condition_variable var;

void watek(mutex& mut, int id, atomic<int>& initialized)
{
    unique_lock<mutex> guard(mut); //to mi domyslnie lokuje mutex bez 2-ego parametru jao std::defer
    ++initialized;
    cout << "Watek " << id << " czeka..." << endl;
    var.wait(guard); //ale to na wstępie robi mi unlocka i czeka na notify
    cout << this_thread::get_id() << " start" << endl;
    cout << this_thread::get_id() << " end" << endl;
}

int main()
{
    thread watki[10];
    atomic<int> initialized = 0;
    mutex mut;
    
    for(int i = 0; i<10; ++i)
        watki[i] = thread(watek, ref(mut), i, ref(initialized));

    {
        lock_guard x{mut};
        cout << "koniec tworzenia" << endl;
    }

    while(initialized < 10)
        this_thread::sleep_for(20ms);
    
    var.notify_all();

    for(int i = 0; i<10; ++i)
        if(watki[i].joinable())
            watki[i].join();

    return 0;
}

https://wandbox.org/permlink/Rsu7LjD5nWo0uzCK

1 użytkowników online, w tym zalogowanych: 0, gości: 1