threats threads thread pthread multiple multi ejemplos ejemplo c++ multithreading c++11 iostream

pthread - threads c++ linux



C++ 11 ejemplo simple de hilo (4)

Soy nuevo en c ++ y estaba buscando en algunos tutoriales de subprocesos multiplataforma de c ++. Estaba investigando esto: http://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/

y estaba intentando ejecutar el siguiente código:

#include <iostream> #include <thread> static const int num_threads = 10; //This function will be called from a thread void call_from_thread(int tid) { std::cout << "Launched by thread " << tid << std::endl; } int main() { std::thread t[num_threads]; //Launch a group of threads for (int i = 0; i < num_threads; ++i) { t[i] = std::thread(call_from_thread, i); } std::cout << "Launched from the main/n"; //Join the threads with the main thread for (int i = 0; i < num_threads; ++i) { t[i].join(); } return 0; }

La salida que estoy obteniendo es la siguiente y no puedo entender por qué:

syd@syd-HP-Compaq-dx7500-Microtower:~/Desktop$ ./ref Launched by thread Launched by thread Launched by thread Launched by thread Launched by thread 201 Launched by thread 5 Launched by thread 6 4 Launched by thread 7 3 Launched by thread 8 Launched from the main Launched by thread 9

Entiendo que los números son aleatorios cada vez, pero algunas veces no se muestran los números y me pregunto por qué.


Están todos allí. Solo están destrozados porque la salida de la consola ocurre en órdenes vagamente aleatorios.

En particular, eche un vistazo al final de la primera línea de salida.


Flushing stream debería hacer el truco :)

Línea siguiente: std::cout << "Launched by thread " << tid << std::endl;

Cambie a: std::cout << "Launched by thread " << tid << std::endl << std::flush;


Hay una condición de carrera en IO (cout) en

std::cout << "Launched by thread " << tid << std::endl;

En realidad, no hay garantía de cout ("Lanzado por hilo", tid, std :: endl) la secuenciación. Y se comporta así:

std::cout << "Launched by thread " ; cout<< tid ; cout<< std::endl;

Puede cambiar call_from_thread a:

void call_from_thread(int tid) { std::cout << std::string("Launched by thread " + std::to_string(tid) + "/n"); }

El siguiente punto está en

t[i] = std::thread(call_from_thread, i);

Cuando creas un hilo, en el momento de la creación se llamará a la función call_from_thread .

Así que es mejor moverse.

std::cout << "Launched from the main/n";

antes de

//Launch a group of threads for (int i = 0; i < num_threads; ++i) { t[i] = std::thread(call_from_thread, i); }

También puede utilizar los holders :

mutex g_i_mutex; // protects cout void call_from_thread(int tid) { lock_guard<mutex> lock(g_i_mutex); cout << "Launched by thread " ; cout<< tid ; cout<< std::endl; }


todo lo que necesita hacer es agregar un mutex y bloquearlo en la posición correcta:

std::mutex mtx;

-

void call_from_thread(int tid) { mtx.lock(); ----------------------------------------------------------- std::cout << "Launched by thread " << tid << std::endl; ----------------------------------------------------------- mtx.unlock(); }

-

mtx.lock(); ----------------------------------------------------------- std::cout << "Launched from the main/n"; ----------------------------------------------------------- mtx.unlock();

refiérase a esto