首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无等待环形缓冲区

无等待环形缓冲区
EN

Stack Overflow用户
提问于 2013-11-22 20:35:14
回答 1查看 994关注 0票数 0

我有一个场景,我可以有多个生产者,但一个环形缓冲区的单一消费者。源代码如下:

代码语言:javascript
复制
typedef struct ring_buffer_t {
    uint8_t *data;
    uint32_t element_size;
    uint32_t element_count;
    uint32_t head;
    uint32_t tail;
    uint32_t mask;
} ring_buffer;

uint32_t ring_buffer_put(ring_buffer *buf, void *data_element) {
    int i;
    uint32_t status = 0;
    uint8_t *buf_pointer;
    uint8_t *element = (uint8_t *) data_element;

    if (buf && data_element) {

        buf_pointer = &buf->data[(buf->head & buf->mask) * buf->element_size];
        for (i = 0; i < buf->element_size; ++i) {
            buf_pointer[i] = element[i];
        }

        status = 1;
        __sync_fetch_and_add(&buf->head, 1);

    }

    return status;
}

uint32_t ring_buffer_size(ring_buffer *buf) {

    return buf->head - buf->tail;
}

uint32_t ring_buffer_empty(ring_buffer *buf) {

    return (ring_buffer_size(buf) == 0);
}

void *ring_buffer_get(ring_buffer *buf) {
    void *element;
    //preserve the invariant that tail is always <= head
    if (ring_buffer_empty(buf)) {
        return 0;
    }

    element = &buf->data[(buf->tail & buf->mask) * buf->element_size];
    __sync_fetch_and_add(&buf->tail, 1);
    return element;
}

问题语句允许我覆盖较旧的条目,例如,这就是我使用and的原因,并且在just时不检查缓冲区是否已满-我只覆盖最旧的条目。然而,我很难推断这是否是线程安全的。如前所述-这是很重要的,这是等待自由(各自定义的锁自由),因为生产者负担不起阻塞。大小始终是2的幂,所以这就是为什么在索引过程中&会起作用。

如果您有任何意见,我们将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2013-11-22 21:51:17

不,你的实现不是线程安全的。

如果两个线程同时使用put元素,它们最终可能会在相同的位置写入,甚至在一个位置写入一半记录,在下一个位置写入另一半记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20145063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档