Un simple grupo de subprocesos de Linux

  

Grupo de subprocesos: en pocas palabras, un grupo de subprocesos es un lote de subprocesos creados por adelantado para manejar el negocio recibido de manera fácil y rápida. En comparación con la llegada tradicional de una tarea, cree instantáneamente un subproceso para tratar, ahorrando la sobrecarga de creación y reciclaje de subprocesos, una respuesta más rápida y una mayor eficiencia.

En linux, se usa la biblioteca de hilos Posix. Primero, se presentan varias funciones comúnmente usadas:

1 Funciones de creación y cancelación de subprocesos

pthread_create

Crear subprocesos

pthread_join

Fusionar subprocesos

pthread_cancel

Cancelar subprocesos

2 Funciones de sincronización de subprocesos

pthread_mutex_lock

pthread_mutex_unlock

pthread_cond_signal

pthread_cond_wait

Para obtener una descripción detallada de la función, consulte la página man

Implementación del grupo de hilos:

La implementación del conjunto de subprocesos se divide principalmente en tres partes, la creación de subprocesos, la adición de tareas al conjunto de subprocesos y la eliminación de tareas de la cola de tareas por parte del subproceso de trabajo.

Hay dos clases principales para implementar, CTask, CThreadPool

/**

Clases que realizan tareas, establecen datos de tareas y se ejecutan

** /

C Code

class CTask

{

protected:

string m_strTaskName; //Nombre de la tarea

void * m_ptrData; //datos específicos de la tarea a ejecutar

public:

CTask () {}

CTask (string taskName)

{

this- > m_strTaskName = taskName;

m_ptrData = NULL;

}

virtual int Run () = 0;

voDd SetData (void * data); //Establecer datos de tarea

};

La clase de tarea es una clase virtual, todas las tareas deben heredarse de la clase CTask, implementar la interfaz de ejecución, Lo que debe implementarse en la interfaz de ejecución es la lógica de la tarea de análisis específica. m_ptrData es un puntero a datos de tarea, ya sea un tipo de datos simple o un tipo de datos complejo personalizado.

Clase de grupo de subprocesos

/**

Grupo de subprocesos

** /

Código de Java
Clase

CThreadPool

{

privado:

vector < CTask * > m_vecTaskList; //lista de tareas

int m_iThreadNum; //iniciado en el grupo de subprocesos Subprocesos

vector estático < pthread_t > m_vecIdleThread; //colección de subprocesos inactivos actuales

vector estático < pthread_t > m_vecBusyThread; //colección de subprocesos en ejecución actualmente

static Pthread_mutex_t m_pthreadMutex; //bloqueo de sincronización de subprocesos

static pthread_cond_t m_pthreadCond; //variable condicional para sincronización de subprocesos

protected:

static void * ThreadFunc (void * threadData); //Nueva función de subproceso del hilo

static int MoveToIdle (pthread_t tid); //Coloca el hilo en el subproceso inactivo después de que el hilo termine de ejecutarse

static int MoveToBusy (pthread_t tid); /Mover a la línea ocupada Ir

Crea int (); //crear todos los hilos

pública:

CThreadPool (int threadNum);

int addTask (CTask * Tarea); //Agregar la tarea al grupo de subprocesos

int StopAll ();

};

Cuando se crea el objeto del grupo de subprocesos, inicie un lote de subprocesos y Coloque todos los subprocesos en la lista libre. Cuando llega una tarea, un subproceso toma la tarea y la procesa.

La sincronización entre subprocesos utiliza bloqueos de subproceso y variables de condición.

Hay dos interfaces externas para esta clase:

La función AddTask agrega la tarea a la lista de tareas del grupo de subprocesos y notifica al subproceso para procesarlo. Cuando llegue la tarea, colóquela en la lista de tareas m_vecTaskList y active un hilo con pthread_cond_signal para su procesamiento.

La función StopAll detiene todos los subprocesos

código Cpp

************************ ************************

Código:

× × × × × × y los tiempos; &veces; &veces; &veces; &veces; &veces; &veces; &veces; &veces; &veces; &veces; &veces; &veces; &veces; CThread.h

#ifndef __CTHREAD

#define __CTHREAD

# include < vector >

# include < string >

# include < pthread.h >

using namespace std;

/**

Clase para ejecutar tareas, configurar datos de tareas y ejecutar

** /

clase CTask

{

protegida:

string m_strTaskName; //nombre de la tarea

void * m_ptrData; //tarea que desea realizar los datos específicos

pública:

CTask () {}

CTask (cadena taskName)

{

this- > m_strTaskName = taskName;

m_ptrData = NULL;

}

virtual int Run () = 0;

vacío SetData (void * data); //establecer los datos de las tareas

};

/**

Grupo de subprocesos

** /

clase CThreadPool

{

privado:

vector < CTask * > m_vecTaskList; //lista de tareas

int m_iThreadNum; //iniciar los hilos de rosca de la piscina

vector estática < pthread_t > m_vecIdleThread; //hilo actualmente inactivo establecer

vector estática < pthread_t > m_vecBusyThread;
//conjunto de hilos Actualmente ejecutoras

estática m_pthreadMutex pthread_mutex_t; //bloqueo de sincronización hilo

pthread_cond_t estática m_pthreadCond; //hilo
condición de sincronización variable de

protegida:

static void * ThreadFunc (void * threadData); //función nuevo hilo de rosca

static int MoveToIdle (tid pthread_t); //Una vez que el hilo termine de ejecutarse, colóquese en la línea inactiva En

static int MoveToBusy (tid pthread_t); //se trasladó a un hilo ocupado para

int Crear (); //crear todos los hilos

pública:

CThreadPool (int threadNum);

int addTask (CTask tarea *); //añadir tareas en el grupo de subprocesos

Copyright © Conocimiento de Windows All Rights Reserved