Programación en lenguaje C bajo Linux (5): programación multiproceso

Hoy hablaré sobre el uso de subprocesos múltiples en Linux .

El subproceso múltiple   se utilizó en la comunicación en serie anterior y la comunicación en red . Hoy hablaré sobre este subproceso múltiple.

  Muchas veces encontrará algunas funciones de bloqueo , como la función select () (monitoreando si un determinado identificador ha cambiado (el puerto serie anterior o el identificador de comunicación de red)), o la función accept () (esperando la conexión del cliente), Estas funciones esperarán hasta que detecte un cambio o que el cliente se conecte y luego salga y luego ejecute las siguientes tareas en secuencia.

  Si se adopta la ejecución de una sola tarea , el bloqueo afectará seriamente la ejecución de otras tareas , por lo que se requiere multitarea en este momento (es decir, ejecutar "simultáneamente" muchos programas modulares sin retrasarse entre sí). El autor aquí está hablando sobre el uso de subprocesos múltiples para la multitarea .

  Nota: al compilar, si utiliza subprocesos múltiples, agregue -lpthread,

arm-linux-gnueabihf-gcc -g -c Mythread.c -o Mythread.o -lpthread

  Función de creación de hilo int pthread_create (pthread_t * restringir tidp, const pthread_attr_t * restringir attr, void * (* start_rtn) (void *), void * restringir arg);

Parámetro 1: ID de subproceso
Parámetro 2: Atributo de subproceso, predeterminado NULL
Parámetro 3: La dirección donde comienza el subproceso, es decir, la dirección de entrada de la función a ejecutar
Parámetro 4: Si la función anterior requiere parámetros, coloque los parámetros en el estructura y pasa la dirección como arg.

Si el valor de retorno no es igual a 0 , la creación falla ; de lo contrario, la creación se realiza correctamente .

Fin del hilo: pthread_join (* pthread, NULL);

ID del hilo en sí: pthread_self ();

Crear hilo

int MyThreadStart(void*(*start_rountine)(void*),pthread_t *thread,void *arg)
{
    
    
	memset(thread,0x00,sizeof(pthread_t));
	int TempReturnValue;

	TempReturnValue = pthread_create(thread,NULL,start_rountine,arg);  //创建线程函数
	if(TempReturnValue!=0)
	{
    
    
		printf("thread created failed!");
	}
	else
	{
    
    
		int id = pthread_self();
		printf("thread id = %d",id);
	}
	return TempReturnValue;
}

Hilo final

void MyThreadStop(pthread_t *pthread)
{
    
    
  	if(*pthread!=0)
  	{
    
    
  		pthread_join(*pthread, NULL);
  		printf("thread is over!");
  	}
}

Bloqueo y desbloqueo de roscas

  Para evitar que varios subprocesos utilicen un recurso al mismo tiempo, como operar un espacio de memoria al mismo tiempo, se producirá un error. Por lo tanto, cuando el subproceso usa el recurso, debe bloquearse y luego desbloquearse una vez que se completa el uso .

pthread_mutex_t CCURec_mutex_t = PTHREAD_MUTEX_INITIALIZER; 

pthread_mutex_lock(&CCURec_mutex_t );
DeQueue(TempPlatformRecQueue,&TempData);
pthread_mutex_unlock(&CCURec_mutex_t );

Función de alarma

  Equivalente a la función de temporizador , la señal () indica la función que se activará cuando se acabe el tiempo , y la alarma () indica el tiempo de temporización .

void handler()
{
    
    
	CCU_To_VST_IntersectionData();
	alarm(T);
}


void TimerFunc()
{
    
    
	signal(SIGALRM, handler);    //注册定时器处理函数

	alarm(T);                  //闹钟函数
}

Realmente llame a tres funciones de subproceso para ejecutarlo:

int temp = MyThreadStart(pthread_NetRecFun_Platform,&PlatformRec_Id,&ArgPlatformRec);
if(temp == 0)
{
    
    
   printf("PlatformRecfun threadFunc successfully!\n");
}

temp = MyThreadStart(pthread_NetSendFun_Platform,&PlatformSend_Id,&ArgPlatformSend);
if(temp == 0)
{
    
    
   printf("PlatformSendfun threadFunc successfully!\n");
}
temp = MyThreadStart(pthread_NetProcessFun_Platform,&PlatformProcess_Id,&ArgPlatformProcess);
if(temp == 0)
{
    
    
   printf("PlatformProcessfun threadFunc successfully!\n");
}

void *pthread_NetRecFun_Platform(void *arg);          //socket通信  接收线程函数
void *pthread_NetSendFun_Platform(void *arg);         //socket通信  发送线程函数
void *pthread_NetProcessFun_Platform(void *arg);      //socket通信  解析线程函数

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Anterior: Programación en lenguaje C en Linux (4): comunicación de red TCP / IP

Supongo que te gusta

Origin blog.csdn.net/qq_34430371/article/details/104471682
Recomendado
Clasificación