1.信号量
在多线程情况下,线程要进入关键代码就得获取信号量(钥匙){sem_init(&sem, 0, 0);},没有信号量的情况下就一直等待sem_wait(&sem),只到别人把钥匙(sem_post(&sem))给你。
这个sem_wait(&sem)后面的就是房子,每当等到别人给了我钥匙(就是等到了sem_post),这个时候就可以进入房子,每进入一次当前的钥匙就没了,下次进入还得等钥匙!
简单解释一下:
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;
}
以下是程序运行的结果