Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] Molteplicità di join

    Probabilmente è un problema(ammesso che lo sia) stupido, ma non riesco proprio a venirne a capo.
    Leggendo la documentazione online avevo erroneamente pensato che con join il thread aspettasse la fine della funzione alla quale è associata. Invece facendo un po' di prove mi sono accorto che non è del tutto vero, nel senso che se ci sono più join all'interno di uno stesso blocco di codice il compilatore le fa partire simultaneamente(penso).

    Allora mi è sorto un dubbio: se io voglio eseguire un thread e poi aspettare ad esempio 10s prima di eseguire un altro thread tutto all'interno dello stesso blocco di codice, come posso fare?

  2. #2
    Quote Originariamente inviata da lovesemiramide Visualizza il messaggio
    Probabilmente è un problema(ammesso che lo sia) stupido, ma non riesco proprio a venirne a capo.
    Leggendo la documentazione online avevo erroneamente pensato che con join il thread aspettasse la fine della funzione alla quale è associata. Invece facendo un po' di prove mi sono accorto che non è del tutto vero, nel senso che se ci sono più join all'interno di uno stesso blocco di codice il compilatore le fa partire simultaneamente(penso).
    Uhm, che libreria di threading stai usando? Posta il codice che usi...
    Allora mi è sorto un dubbio: se io voglio eseguire un thread e poi aspettare ad esempio 10s prima di eseguire un altro thread tutto all'interno dello stesso blocco di codice, come posso fare?
    Metti una sleep tra i due start dei thread?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Uso i thread che il c++11 mette a disposizione.
    Il codice è banalmente questo:
    codice:
    #include <iostream>
    #include <chrono>
    #include <thread>
    
    using namespace std;
    
    void foo() {
        cout << "FOO";
    }
    
    void bar() {
        cout << "BAR";
    }
    
    int main()
    {
        thread t(foo),t2(bar);
    
        t.join();
    
        this_thread::sleep_for(chrono::seconds(2));
    
        t2.join();
    
        return 0;
    }
    
    Il punto è che mi stampa direttamente "FOOBAR" senza aspettare 2 secondi.

    Non so se sto usando male io la classe o se magari ho settato male alcune flag del compilatore(ho settato solo quella per il c++11). Come IDE uso QtCreator e come compilatore MinGW 4.8.
    Ho provato ad impostare la flag sia nel .pro che in project ma l'esito è lo stesso.

    Posto anche i "modi" che ho provato per impostare la flag:
    codice:
    QMAKE_CXXFLAGS += -std = c++11
    
    CONFIG += c++11
    Inoltre ho notato che se semplicemente associo un thread ad una funzione il programma genera una active exception quando viene chiamato il distruttore.
    Davvero non so cosa dire.


    Cercando una soluzione ho trovato un altro "comportamento" strano: se commento le righe nelle quali eseguo le join mi stampa a video sempre "FOOBAR" anche se non chiamo mai le due funzioni.
    Ultima modifica di lovesemiramide; 30-09-2013 a 20:23

  4. #4
    Quote Originariamente inviata da lovesemiramide Visualizza il messaggio
    Uso i thread che il c++11 mette a disposizione.
    Il punto è che mi stampa direttamente "FOOBAR" senza aspettare 2 secondi.
    Perché ti aspetti qualcosa di diverso? Stai facendo partire i due thread praticamente insieme, nel momento in cui chiami la join con ogni probabilità entrambi i thread sono già terminati. (tra l'altro, potresti anche ottenere BARFOO o qualunque mescolanza dei caratteri, dato che non hai locking explicito)
    Inoltre ho notato che se semplicemente associo un thread ad una funzione il programma genera una active exception quando viene chiamato il distruttore.
    Distruttore di che oggetto? Comunque, se hai un oggetto allocato nel thread principale ma usato nei thread, e questo esce di scope (per terminazione del main) è normale ottenere un errore.

    Cercando una soluzione ho trovato un altro "comportamento" strano: se commento le righe nelle quali eseguo le join mi stampa a video sempre "FOOBAR" anche se non chiamo mai le due funzioni.
    I thread partono al momento della creazione degli oggetti-thread; a differenza di altre librerie di threading, i thread C++11 (così come i thread Boost) partono immediatamente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    I thread partono al momento della creazione degli oggetti-thread; a differenza di altre librerie di threading, i thread C++11 (così come i thread Boost) partono immediatamente.


    Ecco l'inghippo! Io avevo capito che partissero quando o join o detach venissero chiamate.

    Grazie mille!

  6. #6
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.