Jestem nowy, aby zwiększyć wątki i utknąłem z tym, jak wyniki są wykonywane z wielu wątków. Mam prosty impuls: odliczanie wątków od 9 do 1; główny wątek czeka, a następnie drukuje "LiftOff .. !!"Nawlekanie wątków: zachowanie cout
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
struct callable {
void operator()();
};
void callable::operator()() {
int i = 10;
while(--i > 0) {
cout << "#" << i << ", ";
boost::this_thread::yield();
}
cout.flush();
}
int main() {
callable x;
boost::thread myThread(x);
myThread.join();
cout << "LiftOff..!!" << endl;
return 0;
}
Problem polega na tym, że muszę użyć wyraźnej instrukcji "cout.flush()" w moim wątku, aby wyświetlić wynik. Jeśli nie użyję funkcji flush(), otrzymam tylko "LiftOff !!" jako wyjście.
Czy ktoś może doradzić, dlaczego muszę użyć flush() jawnie?
Zachowuje się tak samo dla mnie z lub bez 'flush()' (Linux 3.0.6, gcc 4.5.3, doładowanie 1.46). – delicateLatticeworkFever
FWIW, testowałem twój program na Win7x64 (MSVC10) i wypisuję liczby bez spłukiwania(). Jaką platformę testujesz? –
@KonradRudolph: "warunki wyścigu" nie stworzą dwóch oddzielnych buforów standardowych, co jest jedynym możliwym do wyobrażenia wyjaśnieniem, dlaczego 'endl' w main nie spłukuje się po oczekiwaniu na połączony wątek. (nie wspominając już o tym, że w ogóle nie ma tutaj "warunków wyścigu", są tylko dwa wątki i jeden czeka po drugiej). – delicateLatticeworkFever