用C语言写m个并发进程共用一个公共变量X,写出用信号量实现m个进程互斥时 的程序描述(伪代码),给出信号量值的取值范围,并说明每个取值的物理 意义。
时间: 2024-11-20 22:40:55 浏览: 27
在C语言中,使用信号量(Semaphore)可以实现对共享资源如公共变量`X`的互斥访问,防止并发进程中同时修改它。下面是一个简化的伪代码描述:
```c
// 定义信号量,初始化为1(表示只有一个进程可以访问)
sem_t mutex; // mutex 表示互斥锁,初始值为1
void process(void* arg) {
int id = (int)arg; // 假设进程id作为参数传递
sem_wait(&mutex); // 获取锁,如果当前有其他进程持有,则阻塞
printf("Process %d accessing X...\n", id);
// 这里假设X是全局变量或其他需要保护的操作
// 具体操作...
sem_post(&mutex); // 释放锁,允许下一个进程获取
printf("Process %d done with X\n", id);
}
void main() {
int num_processes = m;
for (int i = 0; i < num_processes; i++) {
pthread_create(&thread[i], NULL, process, (void*)i);
}
// 等待所有进程完成
for (int i = 0; i < num_processes; i++) {
pthread_join(thread[i], NULL);
}
}
// 信号量值范围:-1到(m-1)
// -1: 锁已被完全占用,无法获取(负数表示等待队列非空)
// 0 to m-1: 表示可用的锁数量,大于0的值越多,可同时访问公共资源的进程越多
// 物理意义:
// 0:无进程访问公共资源
// n>0:n个进程正在访问公共资源,剩余(n-1)个进程处于等待状态
```
在这个例子中,当一个进程试图访问`X`时,它会通过`sem_wait`减少信号量的值,如果当前值为0,新进程将进入等待状态。当进程完成操作后,通过`sem_post`增加信号量的值,允许另一个进程继续执行。信号量值为-1时,表示已经有一个进程进入了临界区(即访问了`X`),其他进程需等待。
阅读全文