1.信号量
在多线程情况下,线程要进入关键代码就得获取信号量(钥匙){sem_init(&sem, 0, 0);},没有信号量的情况下就一直等待sem_wait(&sem),只到别人把钥匙(sem_post(&sem))给你。
简单解释一下:
2. sem_init(&sem, 0, 0);
这个是创建一把钥匙,钥匙名字为了sem。
0:表示这个信号量是在进程间共享的,如果是非0值,则表示信号量只在当前进程中有效。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;
}
 
以下是程序运行的结果




















