利用锁和条件变量实现线程安全的阻塞队列

利用锁和条件变量实现线程安全的阻塞队列

1、阻塞队列定义:

复制代码
typedef struct data_block{
	char* data;
	int length;
}data_block_t;

typedef struct block_queue {
    data_block_t **blocks;      
    int head;                  
    int tail;                  
    int capacity;              
    int count;                 
    pthread_mutex_t lock;      
    pthread_cond_t not_empty;  
    pthread_cond_t not_full;   
    atomic_bool closed;        
} block_queue_t;

2、队列管理函数:

复制代码
block_queue_t* queue_create(int max_size);
void queue_destroy(block_queue_t *queue);
int queue_enqueue(block_queue_t *queue, data_block_t *block);
data_block_t* queue_dequeue(block_queue_t *queue);
bool queue_remove_block(block_queue_t *queue, data_block_t *target_block);
void queue_close(block_queue_t *queue);
void queue_clear(block_queue_t *queue);

具体实现涉及到多线程的一些知识以及pthread库的使用,其实主要就是上锁解锁操作、利用条件变量阻塞线程和唤醒线程

阻塞队列中的条件变量的作用是:让生产者 / 消费者线程在 "条件不满足时(队列满 / 空)"高效阻塞休眠 (不占 CPU),在 "条件满足时(队列非满 / 非空)"精准被唤醒,而非无意义地轮询检查。

下面列举出队的具体实现:

复制代码
data_block_t* queue_dequeue_block(block_queue_t *queue) {
    if (!queue) {
        return NULL;
    }

    pthread_mutex_lock(&queue->lock);

    while (queue->count == 0 && !atomic_load(&queue->closed)) {
        pthread_cond_wait(&queue->not_empty, &queue->lock);
    }

    if (queue->count == 0) {
        pthread_mutex_unlock(&queue->lock);
        return NULL;
    }

    data_block_t *block = queue->blocks[queue->head];

    queue->blocks[queue->head] = NULL;
    queue->head = (queue->head + 1) % queue->capacity;
    queue->count--;

    // Signal waiting producers
    pthread_cond_signal(&queue->not_full);
    pthread_mutex_unlock(&queue->lock);

    return block;
}
相关推荐
handler013 小时前
【C++11 】Lambda 表达式、std::function 与 std::bind 解析
c++·c·c++11·bind·解耦·function·lamda
handler015 天前
【C++】二叉搜索树详解及其模拟实现(代码)
开发语言·c++·算法·c··二叉搜索树·搜索树
爱学习的程序媛6 天前
C 语言全景指南:从底层原理到工业级实战
c++·c#·c
dozenyaoyida7 天前
RISC-V嵌入式开发:彻底解决“undefined reference to isatty“错误全攻略
经验分享·c·cmake·嵌入式开发·isatty·没有定义问题
Shadow(⊙o⊙)8 天前
模拟实现:glibc_1.0-文件操作函数fopen fclose fwrite fflush实现。
开发语言·c++·学习·c
liulilittle10 天前
TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法
linux·网络·c++·tcp/ip·算法·c·通讯
weixin_4217252611 天前
C语言、C++与C#深度研究报告:从底层控制到现代企业级开发的演进
c语言·c++·c·内存管理·编译模型
不吃土豆的马铃薯13 天前
Spdlog 入门:日志记录器与日志槽基础详解
服务器·开发语言·c++·c·日志·spdlog
金创想13 天前
积木移动题目分析及解题思路——木块问题(1)
c++·算法·字符串·c·刷题·信息学奥赛·积木
不吃土豆的马铃薯16 天前
5.SGI STL 二级空间配置器 _S_chunk_alloc核心函数解析
开发语言·c++·vscode·c·内存池