linux的信号量的使用

1.信号量

在多线程情况下,线程要进入关键代码就得获取信号量(钥匙){sem_init(&sem, 0, 0);},没有信号量的情况下就一直等待sem_wait(&sem),只到别人把钥匙(sem_post(&sem))给你。

这个sem_wait(&sem)后面的就是房子,每当等到别人给了我钥匙(就是等到了sem_post),这个时候就可以进入房子,每进入一次当前的钥匙就没了,下次进入还得等钥匙!

简单解释一下:

2. sem_init(&sem, 0, 0);

这个是创建一把钥匙,钥匙名字为了sem。

  1. 0:表示这个信号量是在进程间共享的,如果是非0值,则表示信号量只在当前进程中有效。
  2. 0:表示信号量的初始值。

3.sem_wait(&sem)

这个函数会一直阻塞在那,直到别人释放钥匙(信号量),才能让代码往下执行。

4.sem_post(&sem);

这个就是把钥匙给一个别人

以下是一个代码demo

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <string.h>
#include<unistd.h>
sem_t sem;

void* change_resource(void* resource) {
    char* msg = (char*)resource;
  
    while(1){
    sem_wait(&sem);
    strcat(msg, "a");
    printf("resource changed with value: %s\n", msg);
    }
    return NULL;
}

int main() {
    int ret;
    pthread_t thread;
    char msg[100] = "Initial ";
    
    ret = sem_init(&sem, 0, 0);
    if (ret != 0) {
        perror("sem_init");
        return 1;
    }

    ret = pthread_create(&thread, NULL, change_resource, (void*)msg);
    if (ret != 0) {
        perror("pthread_create");
        return 1;
    }

    while (1) {
        sem_post(&sem);
        printf("Semaphore send sem\n");
	sleep(1);

    }
    

    return 0;
}

以下是程序运行的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值