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通信 解析线程函数
Anterior: Programación en lenguaje C en Linux (4): comunicación de red TCP / IP