Multithread


Thread

When a program runs, it typically has one thread (called the main thread). On a Windows Application, this thread is used for the Graphic User Interface and the program computation (in this case it is called the GUI thread). For instance, when the user clicks a button to execute a function of the program, this may take little or long time to execute depending on the complexity of the function. If the function takes long to execute, the program GUI will be frozen while the function executes. The rule is that if a function takes more than 0.5 seconds to execute, the programmer must create another thread to execute the function. In the figure below the main thread is displayed in green.
Cuando un programa se ejecuta, éste típicamente tiene una thread (llamada al thread principal). En una aplicación de Ventana, esta thread es usada para Ia Interface Gráfica del Usuario y los cálculos del programa (en este caso, esta es llamada la thread para la GUI). Por ejemplo, cuando el usuario hace clic en un botón para ejecutar una función del programa, esta puede tomar poco o mucho tiempo para ejecutarse dependiendo de la complejidad de la función. Si la función toma mucho en ejecutarse, la GUI del programa se congelará mientras que la función se ejecuta. La regla dice que si una función toma más de 0.5 segundos para ejecutarse, el programador debe crear otra thread para ejecutar la función. En la figura de abajo la thread principal es mostrada en verde.

MainThread

Worker Thread

The main thread is typically used for the GUI. In heavy computation programs, there is an additional thread called the Worker Thread that performs most background computations as shown in the figure below. To begin a new thread you must call the _beginthreadex API. Observe that the function passed to _beginthreadex MUST be a static function, and therefore, it does not access to the member variables or member functions of the class. To solve this problem, you can pass this to get access to the member variables and member functions of the class inside the worker thread function.
La thread principal es típicamente usada por la GUI. En programas de cálculos pesados, hay una thread adicional llamada la Worker Thread que realiza la mayoría de los cálculos en segundo plano como se muestra en la figura siguiente. Para comenzar una nueva thread usted debe llamar the _beginthreadex API. Observe que la función que se pasa a _beginthreadex DEBE ser estática, y por lo tanto, esta no tiene acceso a las variables miembros o a las funciones miembro de la clase. Para resolver este problema, usted puede pasar this para obtener acceso a las variables miembro y a las funciones miembro de la clase dentro de la función de la worker thread.

WorkerThread

_beginthreadex

The _beginthreadex API returns a handle to the new thread. This handle must be stored (in a variable of the type HANDLE) so that we can manipulate the thread. Typically, you should wait for the thread to complete using the WaitForSingleObject API. When the thread has completed, you must call the CloseHandle API to close the thread.
La API _beginthreadex regresa un handle a la nueva thread. Este handle debe ser guardado (en una variable del tipo HANDLE) para poder manipular la thread. Típicamente, usted debe esperar a que la thread complete usando la API WaitForSingleObject. Cuando la thread ha terminado, usted debe llamar la API CloseHandle para cerrar la thread.

BeginThread

Tip
As a computer has a limited number of resources, you must try to avoid creating too many threads. The number of threads is basically limited by the number of processors (and cores) in the computer. If a program has too many threads, each core will perform a little work in each thread at a time. As switching among thread is an expensive operation, a lot of precious CPU time will be wasted. In Server applications, you must try to save CPU time.
Como una computadora tiene un número limitado de recursos, usted debe tratar de evitar de crear demasiadas threads. El número de threads está limitado en su forma básica por el número de procesadores (y de núcleos) en la computadora. Si un programa tiene muchas threads, cada núcleo realizará un poco de trabajo en cada thread a la vez. Como cambiarse entre threads es una operación costosa, mucho tiempo valioso de CPU será consumido. En aplicaciones para Servidor, usted debe tratar de ahorrar tiempo de CPU.

C++ 11 threads

Starting in version 11, the language C++ supports threads by including the <thread> header file. To begin a thread, you will need to pass a global function or static member function of a class to the thread as shown in the following example.
A partir de la versión 11, el lenguaje C++ suporta las threads incluyendo el archivo de encabezado <thread>. Para iniciar una thread, usted necesitará pasar una función global o una función estática miembro de una clase a la thread como se muestra en el siguiente ejemplo.

Program.h
#pragma once //______________________________________ Program.h
#include "resource.h"
#include <thread>

class Program: public Win::Dialog
{
public:
     Program()
     {
     }
     ~Program()
     {
     }
     std::vector<std::thread> threadPool;
     static void SomeFunc(int a, double b);
     . . .
};


Program.cpp
void Program::Window_Open(Win::Event& e)
{
     //______________________________________________ 1. Creates a dynamic array of threads
     size_t i;
     const size_t numThreads = std::thread::hardware_concurrency();
     threadPool.resize(numThreads);
     //______________________________________________ 2. Start each thread
     for ( i = 0; i < numThreads; i++)
     {
          threadPool[i] = std::thread(SomeFunc, 10, 4.5); //Executes SomeFunc(10, 4.5);
     }
     //______________________________________________ 3. Wait for each thread to complete
     for ( i = 0; i < numThreads; i++)
     {
          threadPool[i].join();
     }
}

void Program::SomeFunc(int a, double b)
{
     // Do some heavy work
}


C# Threads

The Thread class is used in C# to create a new thread as shown in the code below. If you call the Program.Run function, the call will return immediately.
La clase Thread es usada en C# para crear un nuevo hilo de ejecución cómo se muestra en el código de abajo. Si usted llama la función Program.Run, la llamada regresará inmediatamente.

Program.cs
class Program
{
System.Threading.Thread thread;

public void Run()
{
thread = new Thread(UpdateResults);
thread.Start();
}

public void UpdateResults()
{
//____________________ Heavy computation


}
};

© Copyright 2000-2021 Wintempla selo. All Rights Reserved. Jul 22 2021. Home