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();