11 multihilo nativa estándar de C ++

Se llama el C ++ nativo 11 multihilo estándar, ya que en C ++ C ++ versión 11 antes de añadir múltiples hilos. La llamada lengua materna es C ++ nativo, diferente de otra implementación de la biblioteca, tales como POSIX, Boost, Winapi, QT [despreciado rara vez se menciona multihilo QT, sino porque quiero usar la biblioteca multithreading QT, estaba gravemente el aprendizaje de C ++ 11 estándar nativa multi-hilo. ], Y otras aplicaciones de subprocesos múltiples. Aprender sobre el sistema C ++ nativo libro de programación multi-roscado, I recomendado por el libro de Anthony Williams "Cpp concurrencia en Acción", la versión china traducida por Chen Xiaowei. Anthony Williams es un multi-hilo C ++ 11 redacción estándar con una.

"C ++ concurrencia en Acción" versión china de acceso en línea a Chen Xiaowei leyó el gitbook, que es un código abierto.

sobre concurrente

"C ++ concurrencia en Acción", un libro explicación popular para el concurrente: El concurrente más simple y básica, se refiere a dos o más eventos independientes ocurrir simultáneamente.
Concurrencia puede verse por todas partes en la vida, podemos caminar y hablar, puede presentar dos manos al mismo tiempo diferentes acciones, así como cada uno de nosotros para vivir una vida independiente - cuando estaba en la natación, se puede ver el partido y así sucesivamente.

¿Por concurrencia : "C++ concurrencia en Acción" se describe en algo abstracto, algo esotérico. En términos populares, es que queremos hacer más cosas al mismo tiempo: el enfoque (SOS) [Hacemos], la tarea de separación. Hay, esperamos mejorar mi actuación de forma concurrente . El propósito de concurrentes siempre ocurre en ambos casos.

 

C ++ concurrencia y multihilo

Antes de C ++ 11 estándar, usando C ++ para desarrollar programas concurrentes tuvo que depender de terceros bibliotecas implementan, o el entorno API del sistema de soporte. Estos no pueden ser el soporte perfecto para el desarrollo de múltiples hebras escalable independiente de la plataforma. C ++ 11 ha traído cambios sorprendentes en el nativo proporciona soporte estandarizado para multithreading. Sobre la historia de múltiples subprocesos C ++, se recomienda la lectura de "C ++ concurrencia en Acción" sección 1.3.1 contenido.

Estoy utilizando el desarrollo de QT, QT5 versión de serie del soporte multi-threading se basa en C ++ nativo 11 estándar multi-threading. próxima serie QT6 debe apoyar plenamente el C ++ 17 estándar. Es necesario tener en cuenta el sistema de C ++ nativo multihilo 11. Este desarrollo QT multi-roscado entendimiento logrará una comprensión más profunda. Por supuesto, el entorno QT, que puede pasar por alto el desarrollo de múltiples hebras nativas en C ++. Porque incluso nativo C ++ y QT empaquetado de interfaz de programación multi-hilo, o también otras bibliotecas, que son sustancialmente no cambian mucho. Y la comprensión de la norma, la mejor manera de desarrollar multiproceso otras bibliotecas también están llamando.

 

proceso

Proceso (proceso) es un programa de ordenador se ejecuta en un conjunto de datos sobre las actividades del sistema es la unidad básica de la asignación de recursos y la programación, es la arquitectura del sistema operativo subyacente. En la arquitectura de ordenador para el proceso inicial de diseño, el proceso básico es la ejecución del programa de la entidad; en el diseño de la arquitectura de computadores contemporánea para el hilo, el hilo es el recipiente de proceso. Programa es la instrucción, la organización de los datos y su descripción del proceso es un programa sólido.

cosa popular es de que estamos ejecutando en un ordenador o teléfono móvil en cada programa, cada proceso es un programa sólido. Debido a que cada proceso es la entidad que ejecuta el programa, y ​​que cada programa por lo menos hay un proceso separado (por supuesto, algunos programas pueden crear varios procesos, como en la figura siguiente disco de red Baidu), y entre los procesos son independientes el uno del otro es que existe. A medida que se están ejecutando: música fresca perro, disco de red Baidu, WPS y así sucesivamente, cuando escuchamos canciones, mientras que también escribir documentos de oficina, el trabajo de éstos, al mismo tiempo se llevan a cabo de forma independiente. Y cada uno es un trabajo en progreso en la implementación de un proceso separado. Proceso es administrado por el mantenimiento del sistema operativo, por lo que el proceso de recursos de arriba con relación a la rosca más grande. Esta es también la aplicación estará más inclinado a desarrollar un hilo de la razón.

Si abrimos el administrador de tareas de Windows veremos:

hilo

El hilo (Inglés: el hilo ) es la unidad más pequeña de un sistema operativo capaz de operación de planificación. Se incluye en el proceso, la operación real del proceso de unidad. Un hilo refiere a un único flujo de control de una secuencia de proceso, un proceso puede complicarse por una pluralidad de hilos, cada hilo en paralelo para realizar diferentes tareas. En el System V Unix y SunOS que también se conoce como procesos ligeros ( procesos ligeros ), pero proceso más ligero se refiere a los hilos del núcleo ( Kernel el hilo ), mientras que el hilo de usuario ( el usuario del hilo de hilos) llamado.

Un hilo es la unidad básica de la programación y el envío de la independencia. Para el sistema operativo hilos del núcleo se pueden programar hilos del núcleo, tales como Win32 hilos; voluntariamente por los subprocesos de usuario proceso de usuario de programación, como el Linux plataforma, la POSIX la rosca ; o mixto programado por los procesos del núcleo y de usuario, tales como 7 Windows hilo.

Las mismas múltiples hilos de proceso para compartir todos los recursos del sistema del proceso, tales como el espacio virtual de direcciones, los descriptores de archivos y procesamiento de señales, y así sucesivamente. Sin embargo, varios hilos en el mismo proceso tiene su propia pila de llamadas ( Call Stack ), inscriba su entorno ( el contexto Registro ), propio hilo de almacenamiento local ( el almacenamiento local de subprocesos ).

Un programa puede tener uno o más procesos, un proceso puede tener un montón de hilos. Debido a que el proceso y el proceso es independiente el uno del otro, por lo que la comunicación y el intercambio de información entre el proceso sería engorroso y difícil de conseguir. Así que la mayor parte de la aplicación es multi-hilo más opciones. Cada hilo en paralelo para realizar diferentes tareas. Aun así el desarrollo multi-roscado no es un asunto sencillo, porque se relaciona con muchos de los conceptos y las trampas. Por ejemplo, el patrón Singleton pre-Bug en el año se producen en uso durante mucho tiempo sólo para descubrir más tarde.

En el multi-núcleo o de múltiples CPU , o soporte Hyper-threading las CPU beneficios de usar el diseño del programa multi-roscado es evidente, es para mejorar la ejecución rendimiento del programa. En una sola CPU en un equipo de un solo núcleo, el uso de multi-Threading, el proceso puede también ser responsable de I / O de procesamiento, la interacción humana por ordenador y la parte a menudo bloqueada de la parte computacionalmente intensivo de la aplicación de separada, escrita específicamente para caballo de batalla hilo realizar intensiva cálculo, aumentando así la eficiencia de la ejecución del programa.

Mi opinión es que el hilo: Un hilo es una secuencia de instrucciones, con el fin de lograr una sola tarea. Por lo tanto, un hilo es tareas de serie.

 multihilo

Multihilo (Inglés: multihilo ), se refiere a la realización de múltiples hilos de un software o hardware concurrente implementación técnica. Un ordenador con el multi-roscar la capacidad debido al soporte de hardware y puede ejecutar más de un hilo, al mismo tiempo, mejorando así la potencia de procesamiento total. El sistema con esta capacidad incluyen un simétrico con múltiples procesadores, procesadores de múltiples núcleos y a nivel de chip de multiprocesamiento ( Chip-Nivel multithreading ), o multihilo simultáneo ( Simultaneous- multihilo procesador). En un procedimiento, estos fragmentos separados programas llamados "hilo" (que se ejecuta el hilo ), que está programado para utilizar el concepto llamado "multi-threading ( multihilo )."

Entiendo: multihilo es ejecutar múltiples hilos en tareas paralelas. punto más popular es que varias tareas de serie en paralelo, al mismo tiempo, realizan simultáneamente múltiples tareas en serie.

Entiendo: La concurrencia no es necesariamente de forma simultánea. En la era de la CPU de un solo núcleo, más de una ilusión. Para unificar todos los procesos, de acuerdo con una orden de un trozo determinado de una ejecución del algoritmo de serie. Concurrencia es más de un concepto, se refiere al inicio de la tarea, al mismo tiempo, pero no necesariamente paralelo. Y ahora, en la era de la multi-núcleo, a menudo acompañada de paralelo concurrente, pero no necesariamente con exactitud. Mi opinión es la siguiente: programa (proceso) que se ejecuta en el equipo con más frecuencia que el número de la base de los ordenadores, el número de hilos en el proceso de oso obvia será más. Como resultado, la CPU no nos puede proporcionar tantos computación paralela. Todavía tienen que volver a los tiempos de un solo núcleo de ejecución de algoritmo. Como resultado, el llamado paralelo y a veces también un concepto ideal. Su propósito y el propósito es no llegar a ser.

Por supuesto, hay una posibilidad de que en algunos sistemas, los procesos en un momento determinado para obtener todos los permisos para realizar CPU núcleo, esta vez si el hilo es aún más que el núcleo de la CPU, es probable que todavía ser algún ejecución en serie.

Parte de la información que, multihilo es absolutamente paralelos. Desde el punto de vista de análisis que esto está mal. También añadir que ese hilo es un sistema operativo unificado permisos de ejecución se les asigna. Por lo tanto, en la mayoría de los programadores que sólo pueden controlar el programa de control de rosca interior. La disposición del sistema de hilos, el programador es impotente.

Antes de implementar una serie de cuestiones a considerar hilo: hilo de seguridad

En un entorno de ejecución de una sola rosca, o si el hilo se suspende debido a que algunos interrupción de la señal en funcionamiento, no importa cómo este hilo para acceder a las variables que desempeñe y de recursos, vamos a seguir para escribir código para asegurar la ejecución (thread-safe ).

Si varios hilos, podemos imaginar, dos o más hilos acceden simultáneamente a un método, pero este método no afecta a los datos externos, sólo afectan a la variable local dentro de la función. Todavía debe ser seguro (a menos que nos importa datos entre los datos generados por estos procesos llaman a este método devuelve tienen relevancia). El problema es que si la vía de acceso que afectará global de datos, o los datos persistentes en la base de datos. Los problemas de seguridad se harán evidentes. Llamamos a objetos o métodos son compatibles con el proceso sin estado. Por el contrario, el método o los objetos multithreading son estado. [Mi comprensión del estado y no tienen ningún estado son: Ningún estado no afecta a los datos externos, sólo afectan a los datos variables locales que producen. No afectará los datos de estado de información externa, y el objeto externo o una propiedad asociada. ]

cuestiones de hilo de seguridad, por ejemplo : Nuestro programa requiere una clase especial que se puede crear un objeto en todo el programa, si usted tiene que crear una instancia de un objeto, que no permiten la re-creación ( Patrones de diseño: patrón Singleton ) . Utilizaremos primero si el objeto == nullptr determinar si el objeto ha sido creado, si ha creado, que no necesitamos para crear objetos de nuevo. Parece que todo es muy armonioso y bello, exactamente lo que desean resultados. Ideal después de todo es ideal, cuando un proceso (que llamamos Una cuando el proceso) no se ha creado para determinar el objeto, esta clase llamará al método constructor de la clase, comenzó a crear el objeto. Puede, a continuación, otro proceso (que llamamos B proceso) sólo tiene una instancia de objeto de esta clase, la función de gestión determinará si la clase ha sido creada instancia de objeto, a continuación, si el proceso Un proceso todavía se crea, no creado instancia de objeto. Entonces el proceso B se considera no crear una instancia de objeto, han comenzado a crear una instancia de objeto. El resultado final es que los dos procesos han creado esta clase especial de instancias de objetos, haciendo que el resultado no es lo que necesitamos. En este momento no sólo no llevó a cabo de acuerdo con nuestro resultado reserva, no habrá resultados erróneos más impredecibles, así como pérdida de memoria puede ocurrir. Se trata de los problemas de seguridad hilo. Este es sólo un ejemplo de los problemas clásicos de un solo modo multi-hilo de seguridad. Si los depósitos en el sistema bancario, el programa de retiros, todavía producirá problemas de hilo de seguridad. Apéndice "C ++ concurrencia en Acción" libro tiene un ejemplo de múltiples hebras completa ATM.

 

Cómo implementar los hilos: Empezar un tema nuevo

<Tema> fichero de cabecera proporciona las herramientas para gestionar e identificar los temas y proporciona una función que permite que el hilo actual a dormir.

clase std :: hilo está en el <hilo> cabecera, std :: clase hilo se utiliza para realizar la gestión de hilo. Proporciona crear, iniciar o llevar a cabo, pero también para proporcionar una identificación de la rosca, y proporcionar otras funciones para la gestión de hilos de ejecución. Así que para la gestión de multi-hilo C ++ sólo tenemos que centrarnos en la funcionalidad <hilo> archivo de cabecera proporcionada.

hilo de entrada: Sabemos que el hilo es la unidad más pequeña de la ejecución del proceso de solicitud. Por lo tanto, una aplicación que al menos habrá un proceso, y el proceso también tendrá que existe al menos un hilo. Una aplicación de la función main () para iniciar la aplicación de los recursos para apoyar el proceso iniciado por la entrada del sistema operativo. Y después de que se complete el proceso de inicialización, la verdadera esencia de su entrega a la zona de operación completa de unión. Por el inicio principal función del hilo (), lo que llamamos el hilo principal o el hilo original . Otros temas (si es necesario un nuevo hilo) que necesitan para lograr su función de entrada (en C ++ estándar, por supuesto, es llamar a la clase std :: hilo).

La creación de un simple hilo de inicio : de hecho, tenemos una cosa muy clara, el hilo es una tarea. Cuando la tarea de trabajo está terminado, la tarea (rosca) también terminó. En otras palabras, el trabajo de un hilo (tarea) que se realiza una vez terminado, este hilo (tarea) terminará automáticamente.

Crear un nuevo hilo en C ++ es construir objeto std :: hilo cuando se construye un objeto std :: hilo vacío, lo que hemos creado el equivalente de un trabajo sustantivo misiones hay en el espacio. Por supuesto, creamos una tarea vacía, no tiene ningún sentido. Así que tenemos que contar objetos std :: hilo (este nuevo proceso [tarea]) necesidad de hacer lo que el punto real. Necesidad de hacer que el trabajo puede ser una función del método, puede ser un objeto, y así sucesivamente.

Por lo tanto, nuestro código es el siguiente:

//我们提供一个函数交给一个新线程(新的任务)去执行
void do_some_work();
std::thread my_thread(do_some_work);

Este es uno de los nuevos hilo más pura, hemos llegado a ser simple. Debido a que sometimos a la nueva rosca (nueva tarea) el trabajo es un método simple función.

Pero cuando damos este nuevo hilo (nueva tarea) que se expidan de trabajo es un método de objeto, que debe contar el método nuevo hilo (nueva tarea) es el objeto cuyo método. Esto es lo que tenemos que pasar un objeto a ser agresivo.

Nota: Esto es para nuevos para std :: amigos constructor de rosca serán un poco confundido. Lo más probable es que va a crear una clase en un nuevo proceso, y luego llama a la clase dentro del camino para el nuevo hilo de ejecución. Podríamos escribir este código.

//假如我们在一个Connection类里
//threadA是Connection类里的方法

std::thread t(&Connection::threadA);  //很多C++编辑器,不会给你发出警告,直到运行时才会发生错误。
t.join();


//刚使用的朋友,更可能会这样写
std::thread t(this->threadA);  //这时编辑器会给你亮出语法错误
t.join();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Publicado 17 artículos originales · ganado elogios 1 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_40583088/article/details/104125900
Recomendado
Clasificación