使用结构体类型改进同步算法,避免全局变量
使用结构体类型改进同步算法,避免全局变量
在6.5.1节的同步算法中,缓冲区定义、读写指针、信号量都是全局变量,管理有些混乱,也不太符合要尽量减少全局变量设置的编程规范。一种改进方法是将缓冲区及相关的变量包装到一个类型为'sbuf_t'的结构体类型变量中,将同步代码添加到'sbuf_inset'和'sbuf_remove'函数中,这样生产者和消费者线程函数就不需要任何同步代码了。
sbuf_t结构体类型的定义如下:
typedef struct {
int *buf; /* 缓冲区数组 */
int n; /* 缓冲区大小 */
int front; /* 缓冲区读取指针 */
int rear; /* 缓冲区写入指针 */
sem_t mutex; /* 互斥信号量 */
sem_t slots; /* 可用的槽位数信号量 */
sem_t items; /* 可用的数据项数信号量 */
} sbuf_t;
其中,'buf'为缓冲区数组,'n'为缓冲区大小,'front'和'rear'分别为缓冲区的读取指针和写入指针。'mutex'、'slots'和'items'分别为互斥信号量、可用的槽位数信号量和可用的数据项数信号量。
sbuf_inset函数的实现如下:
void sbuf_inset(sbuf_t *sp, int item) {
sem_wait(&sp->slots); /* 等待可用的槽位数信号量 */
sem_wait(&sp->mutex); /* 等待互斥信号量 */
sp->buf[(++sp->rear)%(sp->n)] = item; /* 写入数据 */
sem_post(&sp->mutex); /* 释放互斥信号量 */
sem_post(&sp->items); /* 发送可用的数据项数信号量 */
}
sbuf_remove函数的实现如下:
int sbuf_remove(sbuf_t *sp) {
int item;
sem_wait(&sp->items); /* 等待可用的数据项数信号量 */
sem_wait(&sp->mutex); /* 等待互斥信号量 */
item = sp->buf[(++sp->front)%(sp->n)]; /* 读取数据 */
sem_post(&sp->mutex); /* 释放互斥信号量 */
sem_post(&sp->slots); /* 发送可用的槽位数信号量 */
return item;
}
使用'sbuf_t'结构体类型和相应的'sbuf_inset'和'sbuf_remove'函数,可以简化生产者和消费者线程函数的代码,并且避免了全局变量的使用,使程序更加清晰、易读和易于维护。
原文地址: https://www.cveoy.top/t/topic/neQB 著作权归作者所有。请勿转载和采集!