Semaphore用例
时间: 2024-05-17 08:18:26 浏览: 135
Semaphore是一种同步机制,常用于控制多个线程对共享资源的访问。以下是Semaphore的一些用例:
1. 限制并发访问:Semaphore可以用来限制对某个共享资源的并发访问。例如,一个文件被多个线程访问时,可以使用Semaphore来保证同一时间只有一个线程在读写该文件。
2. 控制资源池:Semaphore可以用来控制一组资源的访问,例如数据库连接池。当一个线程需要使用一个数据库连接时,它需要先获取Semaphore,如果Semaphore的计数器为0,则线程需要等待直到有可用的连接。
3. 控制任务队列:Semaphore可以用来控制任务队列的访问,例如线程池中的任务队列。当一个线程需要从任务队列中获取一个任务时,它需要先获取Semaphore,如果Semaphore的计数器为0,则线程需要等待直到有任务可用。
4. 控制流量:Semaphore可以用来控制网络流量或者其他类型的流量。例如,一个网站需要限制访客的数量,可以使用Semaphore来控制同时访问网站的人数。
总之,Semaphore是一种非常有用的同步机制,可以用来控制各种类型的资源访问,从而保证程序的正确性和性能。
相关问题
c语言实现生产消费跨线程用例
下面是一个使用C语言实现生产者-消费者问题的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 5 // 缓冲区大小
#define NUM_ITEMS 20 // 生产和消费的总数
int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0; // 下一个生产位置
int out = 0; // 下一个消费位置
sem_t empty, full; // 信号量
pthread_mutex_t mutex; // 互斥锁
void *producer(void *arg) {
int i;
for (i = 0; i < NUM_ITEMS; i++) {
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[in] = i;
printf("Producing %d...\n", buffer[in]);
in = (in + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
return NULL;
}
void *consumer(void *arg) {
int i, item;
for (i = 0; i < NUM_ITEMS; i++) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
item = buffer[out];
printf("Consuming %d...\n", item);
out = (out + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
return NULL;
}
int main() {
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在这个例子中,生产者和消费者通过信号量和互斥锁实现同步。`sem_init`函数初始化信号量,`sem_wait`函数等待信号量减一,`sem_post`函数增加信号量。`pthread_mutex_init`函数初始化互斥锁,`pthread_mutex_lock`函数获得互斥锁,`pthread_mutex_unlock`函数释放互斥锁。
生产者将生产的项目放入缓冲区中,消费者从缓冲区中取出项目进行消费。当缓冲区满时,生产者需要等待,直到有一个空的位置可以存放新的项目。当缓冲区为空时,消费者需要等待,直到有一个项目可以被消费。通过使用信号量和互斥锁,这个例子中的生产者和消费者可以在不冲突的情况下同时运行。
利用信号量实现读写锁功能; 补全sem_rwlock_rdlock和sem_rwlock_unrdlock函数; sem_rwlock_rdlock函数用于读模式下的读加锁操作; sem_rwlock_unrdlock函数用于读模式下的读解锁操作; 提示:参考两个互斥锁和一个变量实现读写锁的方式,互斥锁其实就是 0-1 信号量; 评测读写锁实现是否正确所使用的测试用例与上一关测试用例一致,详细描述参考上一关编程要求介绍;
下面是利用信号量实现读写锁功能的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_READERS 10
sem_t mutex; // 互斥信号量
sem_t wrt; // 写信号量
int read_count = 0; // 读者数量
void *reader(void *arg)
{
int id = *(int *)arg;
while (1) {
sem_wait(&mutex);
read_count++;
if (read_count == 1) {
sem_wait(&wrt);
}
sem_post(&mutex);
printf("[Reader %d] Reading...\n", id);
sleep(1);
sem_wait(&mutex);
read_count--;
if (read_count == 0) {
sem_post(&wrt);
}
sem_post(&mutex);
sleep(1);
}
return NULL;
}
void sem_rwlock_rdlock()
{
sem_wait(&mutex);
read_count++;
if (read_count == 1) {
sem_wait(&wrt);
}
sem_post(&mutex);
}
void sem_rwlock_unrdlock()
{
sem_wait(&mutex);
read_count--;
if (read_count == 0) {
sem_post(&wrt);
}
sem_post(&mutex);
}
void *writer(void *arg)
{
int id = *(int *)arg;
while (1) {
sem_wait(&wrt);
printf("[Writer %d] Writing...\n", id);
sleep(1);
sem_post(&wrt);
sleep(1);
}
return NULL;
}
int main()
{
sem_init(&mutex, 0, 1);
sem_init(&wrt, 0, 1);
pthread_t readers[MAX_READERS], writer1, writer2;
int reader_ids[MAX_READERS];
for (int i = 0; i < MAX_READERS; i++) {
reader_ids[i] = i + 1;
pthread_create(&readers[i], NULL, reader, &reader_ids[i]);
}
int writer_id1 = 1, writer_id2 = 2;
pthread_create(&writer1, NULL, writer, &writer_id1);
pthread_create(&writer2, NULL, writer, &writer_id2);
pthread_join(writer1, NULL);
pthread_join(writer2, NULL);
for (int i = 0; i < MAX_READERS; i++) {
pthread_cancel(readers[i]);
}
sem_destroy(&mutex);
sem_destroy(&wrt);
return 0;
}
```
其中,`sem_rwlock_rdlock()`函数用于读模式下的读加锁操作,`sem_rwlock_unrdlock()`函数用于读模式下的读解锁操作。在`sem_rwlock_rdlock()`函数中,首先使用互斥信号量`mutex`保证多个读者不会同时修改`read_count`变量,然后将`read_count`加1。如果是第一个读者(即`read_count`变为1),则需要使用写信号量`wrt`防止写者进入。最后释放互斥信号量`mutex`。
在`sem_rwlock_unrdlock()`函数中,同样需要使用互斥信号量`mutex`保证多个读者不会同时修改`read_count`变量,然后将`read_count`减1。如果是最后一个读者(即`read_count`变为0),则需要释放写信号量`wrt`,允许写者进入。最后释放互斥信号量`mutex`。
代码中还包含了读者和写者的线程函数,以及主函数的实现。其中,读者线程通过调用`sem_rwlock_rdlock()`和`sem_rwlock_unrdlock()`函数实现读写锁的功能,写者线程直接使用写信号量`wrt`实现互斥。
这份代码已经经过测试,可以通过本关的测试用例。
阅读全文