请解释【LINUX】中【sem_wait】函数的用法并提供示例
时间: 2024-10-22 12:11:29 浏览: 44
Sem.rar_linux sem_linux sem.c_信号量
在Linux系统中,`sem_wait()`是一个信号量(Semaphore)操作函数,它用于线程同步和互斥访问。信号量是一种计数机制,可以控制对共享资源的并发访问。当一个线程获得了一个信号量(将其值加一),它可以访问该资源;当完成后,通过`sem_wait()`将信号量减回原值,释放给其他等待的线程。
`sem_wait()`函数的基本语法如下:
```c
int sem_wait(sem_t *sem);
```
参数说明:
- `sem_t *sem`: 指向信号量结构体的指针,这个结构通常由`sem_init()`函数初始化。
使用示例:
```c
#include <stdio.h>
#include <semaphore.h>
#define MAX_THREADS 5
sem_t semaphore; // 初始化一个信号量
void worker_thread(int id) {
sem_wait(&semaphore); // 线程等待获取信号量
printf("Thread %d is working on shared resource.\n", id);
// ... 完成任务后
sem_post(&semaphore); // 任务完成,释放信号量
}
int main() {
int i;
sem_init(&semaphore, 0, 1); // 初始化信号量,初始值为1
for (i = 0; i < MAX_THREADS; i++) {
pthread_create(&threads[i], NULL, worker_thread, (void*)i);
}
// 主线程等待所有工作线程结束
for (i = 0; i < MAX_THREADS; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&semaphore); // 销毁信号量
return 0;
}
```
在这个例子中,主线程创建了若干个工作线程,每个工作线程会先调用`sem_wait()`阻塞直到信号量可用。当一个线程完成任务后,它会通过`sem_post()`唤醒下一个等待的线程。这样就实现了资源的有序访问,防止并发时的混乱。
阅读全文