C++ permite subprocesos múltiples mediante el uso del archivo de encabezado ‘subproceso’. El programa actúa como un subproceso, pero para aumentar el tiempo de ejecución/rendimiento del programa, podemos usar subprocesos para ejecutar partes del programa al mismo tiempo. Pero puede dar lugar a problemas de errores de consistencia de la memoria y es posible que no nos brinde el resultado adecuado. Los subprocesos se utilizan para mejorar el rendimiento de las aplicaciones mediante la ejecución de procesos paralelos entre sí.
El subproceso puede compartir el mismo recurso o puntero de referencia. Dos o más subprocesos pueden hacer referencia al mismo objeto o compartir algún recurso común e intentan actualizar o realizar cambios de forma independiente en los datos de recursos compartidos, lo que puede dejar datos inconsistentes.
Ejemplo: En el siguiente programa C++, se usan dos subprocesos para usar las mismas funciones. Primero, debe ejecutarse para el subproceso 1 y luego para el subproceso 2. Pero mostrar la consistencia de la memoria para compartir el mismo resultado de recurso/función no es consistente.
C++14
// C++ program to show // memory consistency #include <bits/stdc++.h> #include <thread> using namespace std; class thread_obj { public: void operator()(int x) { for (int i = 0; i < 50; i++) { cout << "Thread " << x << "\n"; } } }; // Driver code int main() { // thread 1 thread th1(thread_obj(), 1); // thread 2 thread th2(thread_obj(), 2); // wait for thread1 to join th1.join(); // wait for thread2 to join th2.join(); return 0; }
Ejemplo 2: en el siguiente programa C++, se intentará acceder al mismo valor desde diferentes subprocesos, ya que se pueden ver errores de consistencia de la memoria, ya que ambos subprocesos se ejecutarán simultáneamente.
C++
// C++ program to show memory // consistency error #include <iostream> #include <thread> using namespace std; int x = 100; void thread_function() { for(int i = 0; i < 50; i++) { x--; cout << "Thread 1 " << x << "\n"; } } // Driver code int main() { std::thread t(&thread_function); for(int i = 0;i < 100; i++) { x++; cout << "main thread " << x << "\n"; } return 0; }