(simple) boost thread group pregunta


Estoy tratando de escribir una aplicación roscada bastante simple, pero soy nuevo en la biblioteca de subprocesos de boost. Un programa de prueba simple en el que estoy trabajando es:

#include <iostream>
#include <boost/thread.hpp>

int result = 0;
boost::mutex result_mutex;

boost::thread_group g;

void threaded_function(int i)
{
    for(; i < 100000; ++i) {}

    {
        boost::mutex::scoped_lock lock(result_mutex);
        result += i;
    }
}

int main(int argc, char* argv[])
{
    using namespace std;

    // launch three threads
    boost::thread t1(threaded_function, 10);
    boost::thread t2(threaded_function, 10);
    boost::thread t3(threaded_function, 10);

    g.add_thread(&t1);
    g.add_thread(&t2);
    g.add_thread(&t3);

    // wait for them
    g.join_all();

    cout << result << endl;

    return 0;
}

Sin embargo, cuando compilo y corro este programa obtengo una salida de

$ ./test 
300000
test: pthread_mutex_lock.c:87: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Aborted

Obviamente, el resultado es correcto, pero me preocupa este mensaje de error, especialmente porque el programa real, que tiene esencialmente la misma estructura, se queda atascado en el punto join_all (). ¿Puede alguien explicarme lo que está pasando? Hay un mejor manera de hacer esto, es decir, lanzar un número de hilos, almacenarlos en un contenedor externo, y luego esperar a que todos se completen antes de continuar el programa?

Gracias por su ayuda.

Author: Gordon Gustafson, 2009-08-08

4 answers

Creo que el problema es causado por el destructor thread_group que se llama cuando el programa sale. Thread group quiere asumir la responsabilidad de destruir sus objetos de hilo. Vea también en la documentación de boost::thread_group.

Está creando sus objetos thread en la pila como variables locales en el ámbito de su función principal. Por lo tanto, ya se han destruido cuando el programa sale y thread_group intenta eliminarlos.

Como solución, crear tus objetos thread en el montón con new y deja que thread_group se encargue de su destrucción:

boost::thread *t1 = new boost::thread(threaded_function, 10);
...
g.add_thread(t1);
...
 27
Author: VoidPointer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-07 22:01:45

Si no necesitas un identificador para tus subprocesos, intenta usar thread_group:: create_thread() que alivia la necesidad de administrar el subproceso:

// Snip: Same as previous examples

int main(int argc, char* argv[])
{
    using namespace std;

    // launch three threads
    for ( int i = 0; i < 3; ++i )
        g.create_thread( boost::bind( threaded_function, 10 ) );

    // wait for them
    g.join_all();

    cout << result << endl;

    return 0;
}
 26
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 22:35:40

Add_thread() toma posesión del hilo que pasas. El grupo de subprocesos elimina el subproceso. En este ejemplo está eliminando la memoria asignada en la pila, más o menos una ofensa capital.

Función miembro add_thread ()

Void add_thread (thread * thrd);

Condición previa :

La expresión delete thrd es bien formado y no resultará en comportamiento indefinido.

Efectos:

Tomar propiedad del boost:: hilo objeto señalado por thrd y añadirlo al grupo.

Postcondición:

This->size() se incrementa en uno.

No estoy seguro de si eso es lo que está mal en su código, o si esto es solo un error de ejemplo. De lo contrario el código se ve bien.

 3
Author: Eugene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-07 21:12:47

Parece que ninguno de los anteriores respondió realmente a la pregunta.

Me encontré con el tema similar. La consecuencia de esta advertencia (pthread_mutex_lock.c: 87:__pthread_mutex _ lock: Assertion `mutex-> _ data. _owner = = 0 ' failed. Aborted) es que a veces el programa filtrará hilos y causará una excepción boost_resource_error.

El motivo parece ser que el programa continúa ejecutándose después de join_all() aunque la mayoría de los subprocesos todavía están en ejecución ( no terminados ).

 1
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-12 13:39:51