多线程同步队列实现

一个支持多线程同步循环队列的实现 队列元素为一个无符字符数组(即字节数组)。循环队列中只存放该数组的地址。这个地址指向一个存储区域,该存储区的结构为:                                    _______________________________________________                                    |数组长度(4B)|数组内容(由前面的长度决定 阅读详情

多线程同步队列


0x01 程序结构

将多线程同步队列实现为类,对外提供以下接口:

  • get()
  • put()

类内部维护三个句柄用于同步:

  • full信号量表示是否可读
  • empty信号量表示是否可写
  • buffer_mutex互斥对象用于同步对缓冲区的操作

队列中保存指针,这样可实现保存多种类型的对象。

0x02 代码

multithreadedqueue.h


#ifndef ____MULTITHREADEDQUEUE____H____
#define ____MULTITHREADEDQUEUE____H____

#include <windows.h>
typedef unsigned long * pointer32;
class queue
{
    pointer32 * buffer;
    int first;
    int last;
    int buffer_len;

    HANDLE full;
    HANDLE empty;
    HANDLE buffer_mutex;
public:
    queue(int len = 5);
    void put(pointer32 element);
    pointer32 get();
    ~queue();
};

#endif

multithreadedqueue.cpp


#include "multithreadedqueue.h"
#include <Windows.h>

#define TEST

#ifdef TEST
#include <stdio.h>
#endif

queue::queue(int len)
{
    buffer_len = len;
    buffer = new pointer32 [buffer_len];
    first = 0;
    last = 0;

    full = CreateSemaphore(NULL, 0, buffer_len-1, NULL);
    empty = CreateSemaphore(NULL, buffer_len-1, buffer_len-1, NULL);
    buffer_mutex = CreateMutex(NULL, FALSE, NULL);
}

pointer32 queue::get()
{
    pointer32 ret;
    WaitForSingleObject(full, INFINITE);
    WaitForSingleObject(buffer_mutex, INFINITE);

    ret = *(buffer + first);
    first = (first + 1) % buffer_len;

#ifdef TEST
    printf("consumer no.%d: value is %d, addr is 0x%08u\n", GetCurrentThreadId(), *(int*)ret, ret);
    Sleep(100);
#endif // TEST

    ReleaseMutex(buffer_mutex);
    ReleaseSemaphore(empty, 1, NULL);
    return ret;
}

void queue::put(pointer32 element)
{
    WaitForSingleObject(empty, INFINITE);
    WaitForSingleObject(buffer_mutex, INFINITE);

    *(buffer + last) = element;
    last = (last + 1) % buffer_len;

#ifdef TEST
    printf("producer no.%d: value is %d, addr is 0x%08u\n", GetCurrentThreadId(), *(int*)element, element);
    Sleep(100);
#endif // TEST

    ReleaseMutex(buffer_mutex);
    ReleaseSemaphore(full, 1, NULL);
}

queue::~queue()
{
    CloseHandle(full);
    CloseHandle(empty);
    CloseHandle(buffer_mutex);
    delete [] buffer;
}

0x03 测试

test.cpp

#include <windows.h>
#include "multithreadedqueue.h"
#include <stdio.h>

queue q;

DWORD WINAPI Producer(PVOID pvParam)
{
    while (1)
    {
        q.put((pointer32)new int(rand()));
    }

    return 0;
}

DWORD WINAPI Consumer(PVOID pvParam)
{
    pointer32 value;

    while (1)
    {
        value = q.get();
        delete value;
    }
    return 0;
}

int main()
{
    HANDLE hThread;
    DWORD thread_id;
    DWORD producer_count, consumer_count, exec_time;
    printf("producer_count, consumer_count, exec_time:\n");
    scanf("%u %u %u", &producer_count, &consumer_count, &exec_time);
    while (producer_count--)
    {
        hThread = CreateThread(NULL, 0, Producer, NULL, 0, &thread_id);
        CloseHandle(hThread);
    }
    while (consumer_count--)
    {
        hThread = CreateThread(NULL, 0, Consumer, NULL, 0, &thread_id);
        CloseHandle(hThread);
    }

    Sleep(exec_time);

    return 0;
}

测试用例1: 1生产者,1消费者,运行1秒

测试用例2: 1生产者,4消费者,运行3秒

测试用例3: 4生产者,1消费者,运行3秒

测试用例4: 4生产者,4消费者,运行5秒

输出中的value为生成对象的值,addr为地址。值一样时用地址区分存入 队列的对象。

Linux下多线程处理消息队列+epoll实现的帧同步游戏服务器 在原来服务器的基础之上加了多线程处理提高效率,同时将使用数组的地方换成了动态类存分配(应该不会内存泄漏)。四个线程处理消息队列的消息然后放到待发送的队列里面,主线程每帧发送一次消息,发送完了delete指针。后面我担心主线程往消息队列里面加东西的时候跟四个线程抢消息队列可能会耗时比较久于是加了个辅助队列和辅助线程,这样主线程就只用跟辅助线程抢了(不知道有没有一点用) #include <algorithm> #include <iostream> #include <cstri 阅读详情

相关推荐

【Java多线程】JUC之深入队列同步器(AQS)(一)实现细节解析

**AbstractQueuedSynchronizer`抽象队列同步器,简称AQS`,位于` java.util.concurrent.locks 包`下,是用来构建锁或者其他同步组件的`单机多线程基础框架`** - AQS使用`模版模式`,他内置了` 获取锁、释放锁`的方法,**子类继承AQS后无需关心锁获取失败或成功之后的操作,子类应该定义一个`非公开的内部类继承AQS`,`重写锁获取或释放的条件判断的抽象方法`即可使用**; - 内部维护一个`成员变量volatile int state(共

墩墩分墩 1178

java 多线程(四)—— 线程同步/互斥

同步就是多个线程同时访问一个资源。那么如何实现?队列+锁。想要访问同一资源的线程排成一个队列,按照排队的顺序访问。访问的时候加上一个锁(参考卫生巾排队+锁门),访问完释放锁。

qq_44886213的博客 2325

多线程编程中的同步与队列使用技巧

本文深入探讨了Python多线程编程中的同步机制和队列应用。通过实例演示了如何使用条件对象和队列来实现生产者和消费者模式,并解释了线程间通信的关键方法。此外,文章还介绍了Python中不同类型的队列以及编程中的一些良好实践。

weixin_31860973的博客 334

【Java教程】Day15-15 多线程:线程同步——Java并发集合与BlockingQueue

在前面的教程中,我们已经通过ReentrantLock和Condition实现了一个简单的BlockingQueue。今天我们将深入探讨 Java 中的线程安全集合以及如何通过标准库中的并发集合简化多线程编程。

max202011161630的博客 457

【任何电机可使用的七段式s曲线-----包括matlab代码和simulink仿真】

S形加加速(T1)→>匀加速(T2)→减加速(T3)→>匀速(T4 )>加减速(T5)>匀减速(T6)-→>减减速(T7)

weixin_44312889的博客 6309

Cartographer参数调优指南:如何用Lua配置解决建图漂移问题

本文深入解析Cartographer SLAM系统的Lua参数调优方法,针对建图漂移问题提供完整解决方案。从运动滤波、扫描匹配到多传感器融合,详细讲解关键参数配置技巧,并给出仓库物流和服务机器人等典型场景的优化方案,帮助开发者实现精准建图。

vulkan6gpu的博客 116

Java------多线程同步、队列、锁、线程池

线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作,而其他线程又处于等待状态。

yaoshutong的博客 759

智能车竞赛走马观碑组:如何高效识别目标板并优化绕行策略(附实战代码)

本文深入探讨了智能车竞赛走马观碑组中,如何构建从图像识别到路径决策的全栈优化方案。针对目标板识别与绕行策略的核心难点,文章详细解析了基于MobileNetV2的高效识别流水线、结合预瞄点与纯追踪算法的平滑路径规划,以及横向与纵向协同控制策略,并提供了实战代码与调试指南,旨在全面提升小车的比赛表现。

o5p6q的博客 884

多线程之同步队列

package com.lyon.juc; import java.util.concurrent.BlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.TimeUnit; //同步队列 public class BlockingQueueDemo { public static void main(String[] args) { BlockingQue.

u014381566的博客 265

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系:rl命名空间下,主要有八大模块。搞定VS后将逐个拆解。

qq_34839823的博客 1736

simulink求解器选择的小tip

给出了simulink选择求解器的一种tip,与积分初值有关。

高能阿博特的博客 2055

C++11多线程thread,实现同步队列

封装thread-实现多线程,join,detach

weixin_43199441的博客 665

VCS NLP 低功耗验证系列(六):功耗分析与优化——SAIF 报告与验证效率提升

本文是VCS NLP低功耗验证系列的第六篇,主要解决功耗数据采集和验证效率优化问题。文章首先介绍了SAIF(Switching Activity Interchange Format)文件在功耗分析中的作用,详细讲解了VCS的Region-Based SAIF功能,包括三个关键系统任务($saif_region_create、$saif_region_exclude、$saif_region_monitor)的使用方法和工程实践建议。接着从编译侧、运行侧和方法学侧三个维度提出了NLP验证效率优化策略,特别强

元直的博客 472

jdk源码分析书籍_多线程系列之-JDK同步队列底层实现源码分析

课程简介:课程目标:通过本课程的学习,理解并掌握JDK同步阻塞队列的应用及内部实现原理,提升自身技术能力与价值。适用人群:具有Java基础的人群,希望学习Java多线程、并发编程技术的人群。课程概述:阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式,当阻塞队列进行插入数据时,如果队列已满,线...

weixin_34941214的博客 194

IO Virtualization with Virtio.part 2 [十三]

通过对virtio_device_id 中的 device 和 vendor 的值进行比较,我们找到对应的 virtio 驱动,由于这里我们使用 i2c virtio 为例,所以调用 virtio_i2c_probe 进行 virtio i2c 设备的初始化。在和 virtio mmio 设备交互时我们会读取 VIRTIO_MMIO_DEVICE_ID 和 VIRTIO_MMIO_VENDOR_ID,并将其值写入 virtio_device_id 中,这个就会用作后面和 virtio 设备驱动的匹配参数。

cxjczy1990的博客 1211

SpringBoot整合LangChain4j实现RAG检索实战详解

本文介绍了使用LangChain4j框架在Java生态中构建RAG(检索增强生成)应用的最佳实践。作为最接近Python LangChain的Java实现,LangChain4j提供了文档解析、向量化存储到检索增强的全套组件,并与SpringBoot深度集成。文章通过电商智能客服场景,详细演示了从零搭建RAG系统的完整流程:包括使用PostgreSQL+pgvector作为生产级向量数据库、文档加载与向量化处理、声明式AI服务实现以及查询压缩、结果重排等进阶优化技巧。同时对比了内存模式与生产级向量库的差异,

分享AI、区块链技术及应用,未来已来 432

python3.4多线程实现同步的四种方式(锁机制、条件变量、信号量和同步队列)

临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区。 threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁 import threading import time class Num: def __init__(sel

京东放养的爬虫 4065

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Python并行编程(六):多线程同步之queue(队列)实现生产者-消费者模型

方便的队列 当我们处理多线程的资源共享时,线程模块的管理会变得很复杂。我们已经看到了,Python线程模块提供了很多同步原语,包括锁、信号量、条件变量、事件等。虽然有这么多的选择,但是使用队列可能会是管理线程同步的最佳拍档。队列使用起来很容易,因为该模块提供了同步的,安全的对序列,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQue...

weixin_34187862的博客 464

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++11多线程编程:从生产者-消费者问题到同步队列实现

在多线程编程中,生产者-消费者模型是解决线程间数据交换的核心设计模式,它通过同步机制确保数据的安全传递。其原理基于互斥锁和条件变量的协同工作,互斥锁保护共享数据免受竞争条件影响,而条件变量则实现线程间的等待与通知机制,从而避免忙等待。这一模式的技术价值在于解耦生产与消费过程,提升系统吞吐量和响应性,是构建高性能服务器、日志系统和实时数据处理流水线等并发应用的基础。在C++11标准中,std::mutex和std::condition_variable为实现线程安全的同步队列提供了直接支持,使得开发者能够基于

weixin_30768881的博客 225

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python线程同步锁_python3.4多线程实现同步的四种方式(锁机制、条件变量、信号量和同步队列)...

[之前有写过类似的博客,这东西不用老忘,现在又有更清晰的理解了。一、信号量信号量最基本的两个操作就是PV操作:P()操作实现信号量减少,V()操作实现信号量的增加信号量临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区。threading的Lock类,用该类的acquire函数进行加...

weixin_39892481的博客 97

pv原语生产者和消费者_Python并行编程(六):多线程同步之queue(队列)实现生产者-消费者模型...

方便的队列当我们处理多线程的资源共享时,线程模块的管理会变得很复杂。我们已经看到了,Python线程模块提供了很多同步原语,包括锁、信号量、条件变量、事件等。虽然有这么多的选择,但是使用队列可能会是管理线程同步的最佳拍档。队列使用起来很容易,因为该模块提供了同步的,安全的对序列,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueu...

weixin_34824634的博客 718

C++11同步队列实现:多线程生产者消费者模型的核心组件

在并发编程中,线程安全的数据交换是核心挑战。生产者消费者模型通过解耦生产与消费过程,有效协调不同速度的线程协作。其实现原理依赖于互斥锁保证操作的原子性,条件变量实现高效线程同步,避免忙等待。这一机制的技术价值在于提升系统吞吐量、防止数据竞争与死锁,是高并发服务器、日志系统、线程池等场景的基石。本文聚焦于C++11标准库,利用std::mutex和std::condition_variable,结合智能指针与移动语义,实现了一个高效、健壮的同步队列,并深入探讨了其在高并发场景下的应用与优化。

weixin_29213655的博客 239

多线程&JUC(三种实现方式,成员方法,生命周期,死锁,阻塞队列,同步代码块,lock,六种状态,七参数)

Java多线程编程核心概念与实践 摘要:本文系统介绍了Java多线程编程的核心概念,包括进程与线程的区别、多线程实现方式(继承Thread类、实现Runnable/Callable接口)、线程生命周期管理(新建、就绪、运行、阻塞、死亡)。重点讲解了线程同步机制(synchronized同步代码块、Lock锁)、经典的生产者-消费者模式实现,以及线程池的7个关键参数配置。文章还涉及死锁预防、JUC工具包使用、CPU密集型与I/O密集型任务的线程池优化策略,并简要提及volatile、CAS等并发编程高级特性,

2401_85190702的博客 656

python利用队列(queue)实现多线程同步(生产者-消费者模型)

python队列Queue Queue队列是线程安全的,实现了所有需要的锁原语,所以使用Queue进行多线程同步就可以不用考虑资源锁的问题。 Queue实现了三种类型的队列 FIFO队列(先进先出),第一个加入队列的对象被第一个取出,举个例子: from queue import Queue q=Queue() for i in range(5): q.put(i) while no...

花蛤与蟹 2831

powerbuilder中实现多线程同步查询_Python并行编程(六):多线程同步之queue(队列)实现生产者-消费者模型...

方便的队列当我们处理多线程的资源共享时,线程模块的管理会变得很复杂。我们已经看到了,Python线程模块提供了很多同步原语,包括锁、信号量、条件变量、事件等。虽然有这么多的选择,但是使用队列可能会是管理线程同步的最佳拍档。队列使用起来很容易,因为该模块提供了同步的,安全的对序列,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueu...

weixin_39755625的博客 180

【Linux篇】高效的多线程同步:基于阻塞队列实现生产者消费者模型

生产者消费者模型(Producer-Consumer Model)是一种常见的并发编程模型,用于描述多个进程或线程之间共享资源的情况。其核心思想是将任务的生成与任务的处理分离,以便在多线程或多进程环境中有效地协调生产和消费过程。生产者-消费者模型通过解耦生产与消费过程,利用缓冲区协调多线程资源竞争。其核心遵循"321原则":生产者/消费者间互斥同步、同类线程互斥、单一共享缓冲区,实现高效任务分配。

braveact的博客 999
上一篇: i386汇编中16位代码段与32位代码段的区别
Le9a1High
博客等级 码龄12年 0粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值