linux中posix信号量多个线程同时访问共享资源的例子
时间: 2024-02-01 15:13:38 浏览: 113
下面是一个使用 POSIX 信号量实现多个线程同时访问共享资源的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_THREADS 10
#define NUM_ITERATIONS 5
sem_t sem; // 定义信号量
int shared_resource = 0; // 共享资源
void *thread_func(void *arg) {
int i;
int id = *((int *) arg);
for (i = 0; i < NUM_ITERATIONS; i++) {
sem_wait(&sem); // 等待信号量
shared_resource++; // 访问共享资源
printf("Thread %d updated shared_resource to %d\n", id, shared_resource);
sem_post(&sem); // 释放信号量
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
int i;
pthread_t threads[MAX_THREADS];
int thread_ids[MAX_THREADS];
sem_init(&sem, 0, 1); // 初始化信号量
for (i = 0; i < MAX_THREADS; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, thread_func, (void *) &thread_ids[i]);
}
for (i = 0; i < MAX_THREADS; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&sem); // 销毁信号量
return 0;
}
```
在上面的例子中,我们创建了多个线程,每个线程都会访问共享资源 shared_resource。为了避免多个线程同时访问该资源,我们使用了一个信号量 sem,只有获得了该信号量的线程才能访问 shared_resource。在每个线程访问 shared_resource 之前,它会调用 sem_wait() 等待信号量,表示它要访问 shared_resource 了。在访问完 shared_resource 后,线程会调用 sem_post() 释放信号量,表示它已经访问完了 shared_resource,其他线程可以开始访问了。
需要注意的是,在上面的例子中,我们使用了互斥信号量,即 sem 的初始值为 1。这意味着同一时刻只有一个线程可以访问 shared_resource。如果想要多个线程同时访问 shared_resource,可以使用非互斥信号量,即将 sem 的初始值设置为大于 1 的值。
阅读全文