Semáforo para comunicación entre subprocesos de Linux (19)

1. Cantidad de señal

Descripción general de los semáforos Los semáforos se utilizan ampliamente para la sincronización y exclusión mutua entre procesos o subprocesos. Un semáforo es esencialmente un contador de enteros no negativos, que se utiliza para controlar el acceso a recursos públicos. Al programar, puede determinar si tiene permiso de acceso al recurso público en función del resultado de operar el valor del semáforo. Cuando el valor del semáforo es mayor que 0, puede acceder a él; de lo contrario, se bloqueará. La primitiva PV es una operación en el semáforo. Una operación P disminuye el semáforo en 1 y una operación V aumenta el semáforo en 1. Los semáforos se utilizan principalmente en dos situaciones típicas: sincronización y exclusión mutua entre procesos o subprocesos. El tipo de datos del semáforo es: sem_t.

Los semáforos se utilizan para exclusión mutua:
Insertar descripción de la imagen aquí
Los semáforos se utilizan para sincronización:

Insertar descripción de la imagen aquí

2. Inicialice la función de semáforo.

	int sem_init(sem_t *sem, int pshared, unsigned int value);

Función:
Crea un semáforo e inicializa su valor. Se debe inicializar un semáforo sin nombre antes de poder utilizarlo.

Parámetros:
sem: la dirección del semáforo.
pshared: igual a 0, el semáforo se comparte entre subprocesos (de uso común); distinto de 0, el semáforo se comparte entre procesos.
valor: El valor inicial del semáforo.

Valor de retorno:
Éxito: 0.
Fallido: -1.

3. El semáforo menos una función.

	int sem_wait(sem_t *sem);

Función:
Disminuye el semáforo en uno. Si el valor del semáforo es 0, se bloqueará. Si es mayor que 0, se puede disminuir en uno.

Parámetros:
sem: la dirección del semáforo.

Valor de retorno:
Éxito: 0.
Fallido: -1.

4. Intenta restar una función del semáforo.

	int sem_trywait(sem_t *sem);

Función:
intente reducir el semáforo en uno. Si el valor del semáforo es 0, no se bloqueará y regresará inmediatamente. Si es mayor que 0, se puede reducir en uno.

Parámetros:
sem: la dirección del semáforo.

Valor de retorno:
Éxito: 0.
Fallido: -1.

5. Semáforo más una función

	int sem_post(sem_t *sem);

Función:
Incrementar el semáforo en uno.

Parámetros:
sem: la dirección del semáforo.

Valor de retorno:
Éxito: 0.
Fallido: -1.

6. Destruye la función del semáforo.

	int sem_destroy(sem_t *sem);

Función:
Destruir el semáforo.

Parámetros:
sem: la dirección del semáforo.

Valor de retorno:
Éxito: 0.
Fallido: -1.

7. Código de referencia

//=============================================================================
// File Name    : thread_semaphore.c
// Author       : FengQQ
//
// Description  : 信号量
// Annotation   : 
//				  
// Created by FengQQ. 2020-10-05
//=============================================================================
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <semaphore.h>

sem_t sem1,sem2;
char ch='a';

//---------------线程1入口函数---------------
void *pthread1_callback(void *arg)
{
    
    
	while(1)
	{
    
    
		sem_wait(&sem2);		//sem2信号量减一
		ch++;
		sleep(1);
		sem_post(&sem1);		//sem1信号量加一
	}
}
//---------------线程2入口函数---------------
void *pthread2_callback(void *arg)
{
    
    
	while(1)
	{
    
    
		sem_wait(&sem1);		//sem1信号量减一
		putcharputchar(ch);		//输出字符
		fflush(stdout);			//清除读写缓冲区
		sem_post(&sem2);		//sem2信号量加一
	}
}

int main(int argc,char *argv[])
{
    
    
	int ret;
	pthread_t ptid1,ptid2;
	
	sem_init(&sem1,0,1);				//初始化信号量sem1
	sem_init(&sem2,0,0);				//初始化信号量sem2
	
	ret = pthread_create(&ptid1,NULL,pthread1_callback,NULL);		//创建线程1
	if(ret != 0)
	{
    
    
		printf("create new pthread1 failed...\r\n");
		return -1;
	}	
	ret = pthread_create(&ptid2,NULL,pthread2_callback,NULL);		//创建线程2
	if(ret != 0)
	{
    
    
		printf("create new pthread2 failed...\r\n");
		return -1;
	}
	
	ret = pthread_join(ptid1,NULL);									//回收线程1资源
	if(ret != 0)
	{
    
    
		printf("pthread1 join failed...\r\n");
	}	
	ret = pthread_join(ptid2,NULL);									//回收线程2资源
	if(ret != 0)
	{
    
    
		printf("pthread2 join failed...\r\n");
	}
	
	sem_destroy(&sem1);					//销毁信号量sem1
	sem_destroy(&sem2);					//销毁信号量sem2
	
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_39721016/article/details/120604654
Recomendado
Clasificación