semwait()使用
时间: 2023-12-05 15:03:43 浏览: 60
`semwait()` 是一个等待信号量的函数,它的原型如下:
```c
int sem_wait(sem_t *sem);
```
其中,`sem` 是一个指向信号量的指针。
当调用 `sem_wait()` 时,如果信号量的值大于 0,那么它将递减信号量的值并立即返回。如果信号量的值为 0,则调用将被阻塞,直到信号量的值变得大于 0 为止。
`sem_wait()` 函数返回值为 0 表示成功,否则表示出错。如果出错,可以使用 `errno` 来获取错误码。
下面是一个使用 `sem_wait()` 的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#define MAX 5
sem_t sem;
void *producer(void *arg)
{
int i;
for (i = 0; i < MAX; i++) {
sem_wait(&sem);
printf("Producer produced %d\n", i);
}
pthread_exit(NULL);
}
void *consumer(void *arg)
{
int i;
for (i = 0; i < MAX; i++) {
printf("Consumer consumed %d\n", i);
sem_post(&sem);
}
pthread_exit(NULL);
}
int main()
{
pthread_t t1, t2;
sem_init(&sem, 0, 1);
pthread_create(&t1, NULL, producer, NULL);
pthread_create(&t2, NULL, consumer, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_destroy(&sem);
return 0;
}
```
这个例子中,我们使用信号量来同步生产者和消费者的操作。生产者线程在生产一个产品之前要等待消费者把上一个产品消费完毕,并把信号量的值减 1;消费者线程在消费一个产品之后要把信号量的值加 1,以便生产者线程可以继续生产。