`

一种读写可并发进行的队列的实现方法

阅读更多
一.
1 背景
目前采用多线程的处理机制中,如下处理方式是比较常见的:

一个线程负责将上游数据放到一个公共队列中,另外一个线程从公共队列中取出数据进行处理。读取操作都需要共用一个互斥量来保证线程安全,这样写数据和取数据的操作实际上是串行的,有些时候,这个操作将对软件处理性能造成一定影响。如果我们能够实现一个队列,读取操作不需要任何互斥量保护就可以保证线程安全,那么读写线程的处理能力将得到明显提高。
实际上就是保证队列的读取接口和写入接口之间不存在并发冲突,即一个线程只调用读取接口,一个线程只调用写入接口,这两个线程是不需要进行任何同步动作的;如果多个线程同时调用读取接口或者同时调用写入接口,那么读取接口和写入接口可以用不同的互斥量进行同步;最终达到我们的目的:多个线程中,读取速率不会影响写入的速率,反之亦然。
除了读取操作外,很多地方可能还要知道队列的大小,比如内部调试信息,或者实现中需要限制队列的最大容量等,这在读写两个线程都可能用到的,也希望在任意处理线程中不用加锁就可以取到这个信息,这个接口和读写接口都不存在并发冲突的问题,从而提高执行效率。
软件开发网

2 实现方案
需要进行线程同步的操作都是因为大家需要修改(有的线程修改,也有的线程访问)公共资源造成的,只要我们能够保证忘列表中增加一个节点和删除一个节点都不需要都修改同一个资源,而且保证待访问的资源始终有效,那么就可以做到读取操作本身就是线程安全的。
下面是一个列表的简单实现。
struct ListNode
{
int data;
ListNode* next;
}
struct List
{
ListNode* beg;
ListNode* end;
List():beg(0),end(0){}
void push_back(int data)
{
if(!end)
beg = end = new ListNode(node);
else
{
end.next = new ListNode(node);
end = end->next;
}
}
void pop_front()
{
ListNode* top = beg;
beg = beg->next;
delete top;
if(!beg)
end = beg;
}
int front()
{
return beg->data;
}
}
上面的实现,因为增删操作都可能修改内部的beg,end变量,无法做到线程安全的。


如果push_back只修改end变量,pop_front只修改beg变量,那么这两个操作就可以做到线程安全的。如果列表为空的时候beg,end 都以空指针来表示,就不可能做到这一点。如果列表为空的时候,beg,end也指向一个固定节点,那么就可能实现这个操作。如下所示:
struct List
{
ListNode* beg;
ListNode* end;
List():beg(new ListNode(0)),end(beg){}

}
当插入数据的时候都是用已有的end节点来保存数据,然后在生成一个新的表示结束的节点,如下
void push_back(int data)
{
end.data = data;
end.next = new ListNode(0);
end = end->next;
}
这样在插入数据的时候不需要修改beg变量了。在提取数据的时候也是做类似处理:
void pop_front()
{
if(!empty())
{
ListNode* oldBeg = beg;
beg = beg->next;
delete oldBeg;
}
}
考虑实际得取值操作

分享到:
评论

相关推荐

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...

    操作系统进程间通信五种方式

    消息队列是一种异步通信机制,可以将消息存储在一个队列中,等待接收方来进行处理。消息队列通常被用于跨进程的通信,具有高可靠性、高效率、解耦合等优点。 共享内存通信 共享内存是指两个进程可以访问同一个物理...

    Java并发编程.docx

    三种性质 o可见性 :一个线程对共享变量的修改,另一个线程能立刻看到。 缓存 可导致可见性问题。 o原子性 :一个或多个CPU执行操作不被中断。 线程切换 可导致原子性问题。 o有序性 :编译器优化可能导致...

    Rust 并发编程工具

    ShardedLock ,一种具有快速并发读取的分片读写锁。WaitGroup ,用于同步某些计算的开始或结束。公用事业Backoff ,用于自旋循环中的指数退避。(no_std) CachePadded ,用于填充和对齐一个值到缓存线的长度。(no_std...

    操作系统课程实验.rar

    在系统中根据需要添加新的系统调用是修改内核的一种常用手段,通过本次实验,读 者应理解 linux 系统处理系统调用的流程以及增加系统调用的方法。 内容要求 (1) 添加一个系统调用,实现对指定进程的 nice 值的修改...

    分布式事务实践 解决数据一致性

    介绍了分布式系统的定义、实现原则和几种形式,详细介绍了微服务架构的分布式系统,并使用Spring Cloud框架演示了一个完整的微服务系统的实现过程。 5-1 CAP原则和BASE理论简介 5-2 分布式系统综述 5-3 SpringCloud...

    java开源包3

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包4

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    操作系统实验

    请求页式管理是一种常用的虚拟存储管理技术。本设计的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。要求: (1)通过随机数产生一个指令序列,共...

    java开源包1

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包11

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包2

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包6

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包5

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包10

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包8

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

Global site tag (gtag.js) - Google Analytics