C语言编写一个程序,使用信号量(semaphore)实现3个进程对共享资源的互斥访问
时间: 2024-12-08 07:23:18 浏览: 37
在C语言中,我们可以使用POSIX库中的 semaphore(信号量)来控制多个进程对共享资源的互斥访问。信号量是一种同步原语,用于协调并发操作,它有两个基本操作:P操作(wait,等待)和V操作(signal,唤醒)。下面是一个简单的例子,展示了如何创建3个进程共享一个资源,并通过信号量实现互斥访问:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define SEMAPHORE 1 // 共享资源的数量
sem_t sem; // 创建一个信号量
void* process(void *arg) {
int id = (int)arg;
while(1) {
printf("Process %d trying to access the resource...\n", id);
sem_wait(&sem); // P操作:获取锁,阻塞直到信号量为正
printf("Process %d acquired the lock, accessing the resource...\n", id);
// 这里假设每个进程需要花费一些时间处理资源
sleep(id);
printf("Process %d releasing the resource...\n", id);
sem_post(&sem); // V操作:释放锁,唤醒等待者
}
}
int main() {
if (sem_init(&sem, 0, SEMAPHORE) != 0) {
perror("Semaphore initialization failed");
exit(EXIT_FAILURE);
}
pthread_t pids[3]; // 创建进程数组
for(int i=0; i<3; i++) {
pthread_create(&pids[i], NULL, process, (void*)i);
}
for(int i=0; i<3; i++) {
pthread_join(pids[i], NULL);
}
sem_destroy(&sem); // 销毁信号量
return 0;
}
```
在这个示例中,我们创建了一个信号量`sem`,初始化值为1。三个进程分别尝试访问资源,每次访问前会先通过`sem_wait`等待,获取到资源后执行任务,完成后通过`sem_post`释放资源并唤醒下一个等待者。
阅读全文