linux c 字符串环形buf (一)
创始人
2024-11-14 12:05:10
0

#include
#include
#include
#include
#include
#include


#define BUFFER_SIZE 25


pthread_mutex_t rand_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t prod_cond = PTHREAD_COND_INITIALIZER;
pthread_cond_t cons_cond = PTHREAD_COND_INITIALIZER;


typedef struct {
    char *buffer;
    size_t capacity;
    size_t read_index;
    size_t write_index;
    pthread_mutex_t mutex;
} CircularBuffer;

CircularBuffer cb;

void cb_init(CircularBuffer *cb, size_t capacity) 
{
    cb->buffer = (char*)malloc(capacity);
    if (cb->buffer == NULL) {
        perror("malloc rand pool");
        exit(EXIT_FAILURE);
    }
    cb->capacity = capacity;
    cb->read_index = 0;
    cb->write_index = 0;
    pthread_mutex_init(&cb->mutex, NULL);
}

void cb_destroy(CircularBuffer *cb) 
{
    if (cb->buffer)
        free(cb->buffer);

    cb->buffer = NULL;
    pthread_mutex_destroy(&cb->mutex);
}

int cb_write(CircularBuffer *cb, const char *data, size_t len) 
{
    pthread_mutex_lock(&cb->mutex);
    size_t free_space = (cb->read_index + cb->capacity - cb->write_index - 1) % cb->capacity;
    if (free_space <= 0) {
        pthread_mutex_unlock(&cb->mutex);
        return -1;
    }

    len = len < free_space ? len : free_space;

    size_t part1 = cb->capacity - cb->write_index;
    if (part1 >= len) {
        memcpy(cb->buffer + cb->write_index, data, len);
    } else {
        memcpy(cb->buffer + cb->write_index, data, part1);
        memcpy(cb->buffer, data + part1, len - part1);
    }
    cb->write_index = (cb->write_index + len) % cb->capacity;

    pthread_mutex_unlock(&cb->mutex);
    return len;
}

int cb_read(CircularBuffer *cb, char *data, size_t len) 
{
    pthread_mutex_lock(&cb->mutex);
    size_t available_data = (cb->write_index + cb->capacity - cb->read_index) % cb->capacity;
    if (available_data < len) {
        pthread_mutex_unlock(&cb->mutex);
        return -1;
    }

    size_t part1 = cb->capacity - cb->read_index;
    if (part1 >= len) {
        memcpy(data, cb->buffer + cb->read_index, len);
    } else {
        memcpy(data, cb->buffer + cb->read_index, part1);
        memcpy(data + part1, cb->buffer, len - part1);
    }
    cb->read_index = (cb->read_index + len) % cb->capacity;

    pthread_mutex_unlock(&cb->mutex);
    return len;
}

void *func_producer(void *arg)
{
    arg = arg;
    struct timespec tv;

    // Write some data
    ssize_t written;
    char test_str[] = "0123456789";
    tv.tv_sec = 1;
    while(1)
    {
        pthread_mutex_lock(&rand_mutex);
        pthread_cond_timedwait(&prod_cond, &rand_mutex, &tv);
        //pthread_cond_wait(&prod_cond, &rand_mutex);
        //sleep(1);
        while (1)
        {
            written = cb_write(&cb, test_str, strlen(test_str));
            if(written <= 0)
            {
                //pthread_cond_signal(&cons_cond);
                pthread_cond_broadcast(&cons_cond);
                printf("error: Wrote %ld bytes\n", written);
                break;
            }
            printf("Wrote %ld bytes\n", written);
        }
        pthread_mutex_unlock(&rand_mutex);
    }

    return NULL;
}

void *func_consumer(void *arg)
{
    arg = arg;
    struct timespec tv;

    // Read the data back
    ssize_t read_len;
    char read_buf[20];

    tv.tv_sec = 1;

    while(1)
    {
        //sleep(1);
        pthread_mutex_lock(&rand_mutex);
        pthread_cond_timedwait(&cons_cond, &rand_mutex, &tv);
        //pthread_cond_wait(&cons_cond, &rand_mutex);
        while(1)
        {
            memset(read_buf, 0, sizeof(read_buf));
            read_len = cb_read(&cb, read_buf, 10);
            if(read_len <=0)
            {
                //pthread_cond_signal(&prod_cond);
                pthread_cond_broadcast(&prod_cond);
                //sleep(1);
                printf("error: Read %ld bytes: '%s'\n", read_len, read_buf);
                break;
            }
            printf("Read %ld bytes: '%s' out\n", read_len, read_buf);

        }
        pthread_mutex_unlock(&rand_mutex);
    }

    return NULL;
}

// gcc -g -O0 -std=c99 -Wall -Wextra -pedantic -pthread test.c -o string_ring_buffer
// Example usage
int main() {
    int i;
    pthread_t  t_prod[10];
    pthread_t  t_cons[10];

    cb_init(&cb, BUFFER_SIZE);


    for(i=0; i<5; i++)
    {
        pthread_create(&t_prod[i], NULL, func_producer, NULL);
        pthread_create(&t_cons[i], NULL, func_consumer, NULL);
    }

    for(i=0; i<5; i++)
    {
        pthread_join(t_prod[i], NULL);    
        pthread_join(t_cons[i], NULL);    
    }

    // Clean up
    cb_destroy(&cb);

    return 0;
}
 

相关内容

热门资讯

安卓系统怎么设壁纸桌面,轻松设... 亲爱的手机控们,你是不是也和我一样,对手机壁纸和桌面布局情有独钟?想要让你的安卓手机焕然一新,个性化...
安卓系统6.0怎么root教程... 亲爱的安卓用户们,你是否曾梦想过让你的手机拥有超能力?没错,我说的就是root!今天,就让我带你一步...
安卓2.2系统当贝市场,体验升... 你有没有想过,那些老旧的安卓设备,虽然已经不再流行,但它们在某个角落里,可能还在默默无闻地发挥着余热...
安卓14系统为啥卡顿,探究性能... 最近是不是发现你的安卓手机有点儿不给力了?打开应用慢吞吞的,滑动页面卡得像老牛拉车,这可真是让人头疼...
采集无锡安卓系统的公司,技术驱... 你有没有想过,在这个科技飞速发展的时代,手机操作系统的重要性简直不言而喻?而在中国,有一个城市,它的...
安卓新系统有问题,揭秘常见故障... 最近你的安卓手机是不是也遇到了点小麻烦?别急,让我来给你细细道来,看看这个新系统到底有哪些让人头疼的...
u盘安卓随身系统,U盘随身携带... 你有没有想过,把安卓系统随身携带,随时随地都能用上?没错,今天就要给你揭秘一个神奇的小玩意——u盘安...
安卓手机有俩系统吗,体验双重魅... 你有没有发现,安卓手机的世界里,好像藏着两个神秘的小秘密呢?没错,就是那个让人又爱又恨的安卓系统。今...
安卓系统恢复怎么搞,轻松应对系... 手机突然卡壳了,系统崩溃了,是不是瞬间感觉整个人都不好了?别慌,今天就来教你一招,让你的安卓手机重获...
windows和安卓系统的关系... 你有没有想过,为什么你的手机和电脑有时候会像好朋友一样,互相配合得天衣无缝?其实,这背后有一个大大的...
安卓11怎么降级系统,轻松还原... 你有没有发现,安卓11系统虽然功能强大,但有时候也会有点小闹心呢?比如,某些应用不支持,或者系统运行...
正版授权!游戏推荐斗牛房卡出售... 今 日消息,天蝎大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
推荐一款!金花房卡批发女娲大厅... 女娲大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
安卓系统误删无法开机,紧急修复... 手机里的照片、联系人、重要文件,说没就没了!最近,身边的朋友纷纷向我抱怨,他们的安卓手机因为误删数据...
玩家攻略,牛牛充值房卡新大圣/... 玩家攻略,牛牛充值房卡新大圣/新道游/微信链接房卡购买渠道新大圣/新道游是一款非常受欢迎的游戏,咨询...
一分钟了解!牛牛房卡出售红桃众... 红桃众娱是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
IA解析/金花房卡批发玄灵大厅... IA解析/金花房卡批发玄灵大厅/微信链接房卡最低价格Sa9Ix苹果iPhone 17手机即将进入量产...
我来教你/牛牛房卡代理新518... 新518互娱房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3...
正规平台有哪些,金花房卡代理零... 微信游戏中心:九天大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
荣耀magic是安卓系统吗,探... 你有没有听说过荣耀Magic这款手机?最近它可是手机圈里的热门话题呢!很多人都在问,荣耀Magic是...