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

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

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;
}
相关推荐
Chen_LSN4 天前
C语言——深度理解指针(3)
c
向宜xy5 天前
“试试这套 SDD 规范驱动工作流”---我认真研究了“AI乱改代码”的解决方案,然后问了三个问题
c·ai编程
云泽80813 天前
Visual Studio 2026 新手保姆级教程:环境搭建、界面优化与编译器配置详解
开发语言·c++·c·开发工具·visual studio
众少成多积小致巨14 天前
C 核心概念、语法
c
C++ 老炮儿的技术栈15 天前
OpenCV 实现社保卡透视矫正:Hough 直线提取四角并转正证件图像
c语言·c++·人工智能·opencv·算法·计算机视觉·c
poll_Ff15 天前
CSAPP:Shell Lab笔记
c
会周易的程序员16 天前
Libnodave S7 通信库:架构设计与实现解析
linux·c++·物联网·架构·c·s7·工业协议
天空'之城18 天前
C 语言工业级通用组件手写 04:阻塞队列
c语言·嵌入式开发·阻塞队列·多线程开发
wdfk_prog20 天前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
shx_wei1 个月前
从函数调用到进程替换:使用 execl、CMake 与 PowerShell 构建一个多可执行程序
linux·c语言·windows·c