(1)
(2) 代码举例:
c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t semaphore;
void* thread_function(void* arg)
{
sem_wait(&semaphore); // 等待信号量
printf("Thread %ld entered critical section.\n", (long)arg);
sleep(1); // 模拟临界区工作
printf("Thread %ld leaving critical section.\n", (long)arg);
sem_post(&semaphore); // 释放信号量
return NULL;
}
int main()
{
pthread_t thread1, thread2;
if (sem_init(&semaphore, 0, 1) != 0) { // 初始化二进制信号量,初始值为1
perror("sem_init");
exit(EXIT_FAILURE);
}
pthread_create(&thread1, NULL, thread_function, (void*)1); // 创建两个线程
pthread_create(&thread2, NULL, thread_function, (void*)2);
pthread_join(thread1, NULL); pthread_join(thread2, NULL); // 等待线程完成
sem_destroy(&semaphore); // 销毁信号量
return 0;
}
++ 在这个示例中,两个线程尝试进入临界区,但由于信号量的初始值为 1,因此一次只能有一个线程进入。当一个线程进入临界区后,它会等待一秒钟(模拟工作),然后离开临界区并释放信号量,允许另一个线程进入。
(3)
(4)
谢谢