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.