¿Alguien puede publicar un ejemplo simple de iniciar dos subprocesos (orientados a objetos) en C ++.
Estoy buscando objetos de subprocesos reales de C ++ en los que pueda extender los métodos de ejecución (o algo similar) en lugar de llamar a una biblioteca de subprocesos de estilo C.
Dejé de lado cualquier solicitud específica del sistema operativo con la esperanza de que quien respondiera respondería con bibliotecas multiplataforma para usar. Solo estoy haciendo eso explícito ahora.
c++
multithreading
Zak
fuente
fuente
Respuestas:
Cree una función que desee que ejecute el hilo, por ejemplo:
Ahora cree el
thread
objeto que finalmente invocará la función anterior de la siguiente manera:(Necesitas
#include <thread>
acceder a lastd::thread
clase)Los argumentos del constructor son la función que ejecutará el hilo, seguidos de los parámetros de la función. El hilo se inicia automáticamente en la construcción.
Si más adelante desea esperar a que se termine el hilo ejecutando la función, llame a:
(Unirse significa que el hilo que invocó el nuevo hilo esperará a que el nuevo hilo termine la ejecución, antes de que continúe su propia ejecución).
El código
Más información sobre std :: thread aquí
-std=c++0x -pthread
.fuente
-std=c++0x
(en lugar de-std=c++0x
)" Creo que el segundo "c ++ 0x" debería ser "c ++ 11", pero eso no es posible cambiarlo porque la edición es demasiado pequeña.task1
. Entonces el puntero de función también se denota portask1
. Pero gracias por traer esto a colación porque creo que estaba equivocado y que es equivalente a&task1
, por lo que no importa qué forma que elija para escribir (si es así, supongo que puntero a puntero de la función es&&task1
- que sería malo ) Cuestión relevante .Bueno, técnicamente cualquier objeto de este tipo terminará construyéndose sobre una biblioteca de subprocesos de estilo C porque C ++ solo especificó un
std::thread
modelo de stock en c ++ 0x, que se acaba de clavar y aún no se ha implementado. El problema es un tanto sistémico, técnicamente el modelo de memoria c ++ existente no es lo suficientemente estricto como para permitir una semántica bien definida para todos los casos de "suceder antes". Hans Boehm escribió un artículo sobre el tema hace un tiempo y fue fundamental para elaborar el estándar c ++ 0x sobre el tema.http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html
Dicho esto, hay varias bibliotecas C ++ de subprocesos multiplataforma que funcionan bien en la práctica. Los bloques de creación de subprocesos de Intel contienen un objeto tbb :: thread que se aproxima mucho al estándar c ++ 0x y Boost tiene una biblioteca boost :: thread que hace lo mismo.
http://www.threadingbuildingblocks.org/
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
Usando boost :: thread obtendrías algo como:
fuente
También hay una biblioteca POSIX para sistemas operativos POSIX. Verifique la compatibilidad
compilar con -lpthread
http://en.wikipedia.org/wiki/POSIX_Threads
fuente
fuente
Al buscar un ejemplo de una clase C ++ que llama a uno de sus propios métodos de instancia en un nuevo hilo, surge esta pregunta, pero no pudimos usar ninguna de estas respuestas de esa manera. Aquí hay un ejemplo que hace eso:
Clase.h
Class.cpp
Tenga en cuenta que este ejemplo no entra en mutex o bloqueo.
fuente
A menos que uno quiera una función separada en los nombres globales, podemos usar funciones lambda para crear hilos.
Una de las principales ventajas de crear hilos usando lambda es que no necesitamos pasar parámetros locales como una lista de argumentos. Podemos usar la lista de captura para el mismo y la propiedad de cierre de lambda se encargará del ciclo de vida.
Aquí hay un código de muestra
De lejos, he encontrado que C ++ lambdas es la mejor manera de crear hilos especialmente para funciones de hilo más simples
fuente
Depende en gran medida de la biblioteca que decida usar. Por ejemplo, si usa la biblioteca wxWidgets, la creación de un hilo se vería así:
Si su hilo principal llama al método CreateThread, creará un nuevo hilo que comenzará a ejecutar el código en su método de "Entrada". Tendrá que mantener una referencia al hilo en la mayoría de los casos para unirse o detenerlo. Más información aquí: documentación de wxThread
fuente