使用结构体类型改进同步算法,避免全局变量

在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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录