Segurança de thread-----sinal sem nome

Semáforo POSIX sem nome

       Se quisermos resolver a exclusão mútua de sincronização entre threads dentro de um processo, talvez não haja necessidade de usar sinais nomeados
quantidade, como esses threads compartilham o mesmo espaço de memória, podemos definir um ambiente mais leve, baseado em memória (sem qualquer
Qualquer sistema de arquivos interno) semáforo sem nome para atingir o objetivo.

As etapas para usar este semáforo são

1. Defina este tipo de variável (como uma variável global) em uma área que pode ser acessada por esses threads. O tipo é sem_t .
2. Inicialize-o com sem_init() antes que qualquer thread o utilize .
3. Use sem_wait()/sem_trywait() e sem_post() para realizar operações P e V respectivamente .
4. Use sem_destroy() para destruí-lo quando não for mais necessário .
Semáforos sem nome geralmente são usados ​​entre threads dentro de um processo, portanto o parâmetro pshared geralmente é 0 . Quando tal sinal é
Quando a quantidade é utilizada entre processos, ela deve ser definida em um local que cada processo possa acessar – como a memória compartilhada.
#include<stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>
//定义线程间共享资源
sem_t sem;

//定义一个指针作用与线程之间的共享内存
char *mem_map=NULL;

void *function(void *arg)
{
    char *msg=(char *)arg;
   
    printf("线程号:%ld 收到参数:%s\n",pthread_self(),msg);
   while (1)
{
    printf("function获取资源 ");
     sem_wait(&sem);
     printf("function获取成功\n");
     printf("msg:%s\n",mem_map);
     sem_post(&sem);
     usleep(1000);
}
}
int main(int argc, char const *argv[])
{
   mem_map=calloc(1,32);

    //初始化无名信号量  0表示线程间 ,1表示初始化资源量为1
if(sem_init(&sem, 0, 1))
{
    perror("sem init error");
    return -1;
}
    pthread_t thread;
   pthread_create(&thread, NULL,function, "Hello Gz123");   
while (1)
{
    printf("main获取资源 ");
    sem_wait(&sem);
     printf("main获取成功\n发送数据:");
   fgets(mem_map,32,stdin);
   printf("main 释放资源\n");
   sem_post(&sem);
   usleep(1000);
}
   pthread_join(thread,NULL);
    return 0;
}

   Para os três semáforos com os quais entramos em contato: semáforos system-V e semáforos POSIX ( named-sem e unnamed-sem), a seguir estão suas diferenças:

1. O semáforo sys-V é mais antigo e a sintaxe é difícil . Os semáforos POSIX são simples e leves.
2. O semáforo sys-V pode executar P/V atômico em vários elementos de semáforo que representam vários recursos ao mesmo tempo.
Operação, o semáforo POSIX só pode operar um semáforo por vez.
3. O semáforo sys-V e o nomeado - sem são recursos de todo o sistema e continuam a existir após o processo desaparecer.
unnamed-sem é um recurso de todo o processo que desaparece quando o processo é encerrado.
4. A operação P/V do semáforo sys-V pode adicionar ou subtrair um valor maior que 1 ao elemento semáforo , enquanto o semáforo POSIX
Cada operação P/V está adicionando ou subtraindo 1 .
5. O semáforo sys - V suporta até operações de desfazer - quando um processo executa uma operação P/V no semáforo sys-V
Você pode marcar a operação como precisando ser revogada e, quando o processo terminar, o sistema revogará automaticamente aquelas marcadas
operar. Os sinais POSIX não possuem esta funcionalidade.
6. O semáforo sys-V e o nomeado-sem são adequados para sincronizar a exclusão mútua entre processos, enquanto o sem nome -sem é adequado para
Usado para sincronizar a exclusão mútua entre threads.

おすすめ

転載: blog.csdn.net/m0_52467164/article/details/127562924