Ubuntu调用库semaphore
时间: 2023-06-30 21:19:20 浏览: 160
在Ubuntu中,可以使用semaphore.h头文件中定义的函数来调用信号量库。
下面是一个简单的示例代码,演示如何在Ubuntu上使用信号量:
```c
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#define MAX_THREADS 5
sem_t semaphore;
void* thread_func(void* arg) {
int thread_id = *(int*)arg;
printf("Thread %d is waiting...\n", thread_id);
sem_wait(&semaphore);
printf("Thread %d has acquired the semaphore!\n", thread_id);
sem_post(&semaphore);
printf("Thread %d has released the semaphore.\n", thread_id);
pthread_exit(NULL);
}
int main() {
pthread_t threads[MAX_THREADS];
int thread_ids[MAX_THREADS];
sem_init(&semaphore, 0, 1);
for(int i = 0; i < MAX_THREADS; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, thread_func, &thread_ids[i]);
}
for(int i = 0; i < MAX_THREADS; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&semaphore);
return 0;
}
```
该示例创建了5个线程,每个线程都会尝试获取一个名为semaphore的信号量。由于初始值为1,因此第一个线程将立即获得信号量。其他线程将等待,直到信号量被释放为止。
在线程获得信号量后,它将打印一条消息,然后立即释放信号量。最后,所有线程都将退出,semaphore将被销毁。
注意,在使用信号量时,需要注意避免死锁的情况。比如,如果一个线程在等待信号量时被阻塞,而另一个线程又试图获取该信号量,那么就会发生死锁。因此,需要谨慎地使用信号量,确保不会出现这种情况。
阅读全文