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;
}
以下是程序运行的结果