linux中posix信号量多个线程同时访问共享资源的例子,sem初始为大于1的值
时间: 2024-02-01 20:13:42 浏览: 73
下面是一个使用 POSIX 信号量实现多个线程同时访问共享资源的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM_THREADS 5
int shared_resource = 0;
sem_t sem;
void *thread_func(void *arg) {
int id = *(int *)arg;
for (int i = 0; i < 5; i++) {
sem_wait(&sem); // 等待信号量
printf("Thread %d: shared_resource = %d\n", id, shared_resource);
shared_resource++; // 访问共享资源
sem_post(&sem); // 发送信号量
}
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_args[NUM_THREADS];
sem_init(&sem, 0, 2); // 初始化信号量为2
for (int i = 0; i < NUM_THREADS; i++) {
thread_args[i] = i;
pthread_create(&threads[i], NULL, thread_func, &thread_args[i]);
}
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&sem); // 销毁信号量
return 0;
}
```
在这个例子中,我们创建了 5 个线程,每个线程都会在每次访问共享资源之前等待信号量。由于信号量的初始值为 2,所以前两个线程可以同时访问共享资源,而后面的线程需要等待前面的线程释放信号量后才能访问共享资源。
注意,信号量的值应该初始化为大于等于 1 的值,否则线程可能会一直等待信号量,导致死锁。在这个例子中,我们将信号量的值初始化为 2,这样可以保证至少有两个线程可以同时访问共享资源。
阅读全文