Piszę prosty program do testowania wątku w C++ 11, ale std::cout
nie działa tak, jak oczekuję.przy użyciu std :: cout w wielu wątkach
class Printer
{
public:
void exec()
{
mutex m;
m.lock();
cout<<"Hello "<<this_thread::get_id()<<endl;
chrono::milliseconds duration(100);
this_thread::sleep_for(duration);
m.unlock();
}
};
int main()
{
Printer printer;
thread firstThread([&printer](){
while(1)
printer.exec();
});
thread secondThread([&printer](){
while(1)
printer.exec();
});
firstThread.join();
secondThread.join();
}
niektóre wyniki:
Hello 11376
Hello 16076
Hello 16076
Hello Hello 11376
16076
Hello 11376
,....
użyłem mutex do blokowania wątki więc nie mogę zrozumieć dlaczego dwa wątki realizują std::cout
w tym samym czasie. To szwy bardzo zmęczony mnie. Czy ktoś wytłumaczy, co się dzieje!?!
Po wdrożeniu rozwiązania przewidzianego w odpowiedzi powinieneś również przejść do używania 'lock_guard's zamiast ręcznego blokowania/odblokowywania połączeń. I nie przejmuj się spłukiwaniem (np. Z 'endl'); po prostu użyj "\ n". – bames53