返回顶部
首页 > 资讯 > 前端开发 > JavaScript >怎么理解多核编程中的线程分组竞争模式
  • 188
分享到

怎么理解多核编程中的线程分组竞争模式

2024-04-02 19:04:59 188人浏览 泡泡鱼
摘要

这篇文章主要介绍“怎么理解多核编程中的线程分组竞争模式”,在日常操作中,相信很多人在怎么理解多核编程中的线程分组竞争模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解

这篇文章主要介绍“怎么理解多核编程中的线程分组竞争模式”,在日常操作中,相信很多人在怎么理解多核编程中的线程分组竞争模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解多核编程中的线程分组竞争模式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在多核编程中,竞争导致的CPU饥饿现象是引起多核CPU性能无法发挥的最重要原因之一,在多核编程中的锁竞争难题一文中已经讲过锁竞争对性能的影响,如何消解锁竞争导致的CPU饥饿现象成了迫切需要解决的问题。

目 前业界发展的无锁编程技术可以有效降低锁竞争引起的性能下降问题,无锁编程主要是采用原子操作来替代锁,只存在原子操作竞争问题,由于原子操作只是一条指 令,速度非常快,因此可以近似地看成是无锁竞争的,除非原子操作非常频繁。无锁编程难度非常高,从目前的情况来看,普通程序员要亲自进行无锁编程是不现实 的事情。并且目前只有少数数据结构可以实现无锁编程,从目前商用的无锁编程库NOBLE来看,只提供了队列、栈、链表、词典、带引用计数的垃圾回收内存管理等少数几种无锁编程结构,只能解决部分锁竞争问题,这个库的售价高昂,以下是从NOBLE的网站上拷贝下来的售价。

$1395 USD, NOBLE Professional Edition, Evaluation License 1 Months, windows

$3295 USD, NOBLE Professional Edition, Evaluation License 3 Months, Windows

看了这个售价,估计国内也没有多少公司愿意出这么高昂的价钱的购买这个一个功能有限,且使用起来不像以前的使用锁的库那么方便的库。

既然没有无锁编程的免费午餐可以享用,那么使用锁来编程的话,可不可以避免锁竞争导致的CPU饥饿现象呢?答案是可以的,这就是文章标题中的线程分组竞争模式,它使用锁来进行保护共享数据,但是又避免了锁竞争时出现CPU饥饿现象。其实这个模式在业界已经有了很成功的实践,那就是队列池。当然这个模式的应用不仅仅限于队列池,也可以用到很多其他的满足一定条件的共享数据保护上。

先看一下线程分组竞争模式的基本思想,所谓线程分组竞争就是将线程分成若干个组,每个组的线程间存在锁竞争,但是不同组之间的线程不存在锁竞争。下图以添加操作和删除操作作为示例来显示2个分组线程竞争的情况:

怎么理解多核编程中的线程分组竞争模式

图中显示了两个分组的线程竞争情况,共有四个线程分成两组进行竞争,添加操作线程1和删除操作线程1之间存在锁竞争情况,添加操作线程2和删除操作线程2之间存在锁竞争情况,但是添加操作线程1(或删除操作线程1)和添加操作线程2和删除操作线程2之间不存在锁竞争。

在这种分组锁竞争模式下,任意一组线程中,至少有一个线程在执行,因此如果有N组线程的话,那么至少有N个线程在执行,如果N大于等于CPU的核数,那么任意一个CPU     核上都有线程一直在运行,可以充分保证CPU不会产生饥饿现象。

并不是任意共享数据都可以采用线程分组竞争的形式来进行访问,共享数据必须可以分成若干个独立的子数据,每次操作只需要操作某个子数据,一次操作中不需要操作多个子数据。

线程分组竞争模式和无锁编程相比,有着很大的优势,最重要的优势有两点:

一、使用有锁编程,编程难度很小,易于为普通程序员掌握。

二、并发性比无锁编程更好,无锁编程中存在原子操作竞争问题,其竞争激烈程度会随CPU核数增加而增加,特别是当原子操作包含在大循环中时,原子操作竞争最坏情况下会使性能降到和单核CPU一样。而线程分组模式中各个CPU核完全是并行运行的,CPU核相互间不存在竞争问题,因此CPU核数增加不会造成任何影响。

以上讲的是线程分组竞争模式的一种情况,实际情况中很多情况和这种模式并不完全符合,因此线程分组模式存在一些变种以适应更多的实际情况。下图便是一个最常见的变种:

怎么理解多核编程中的线程分组竞争模式

如上图所示,在这个变种中添加操作线程只有一个,而删除操作线程却有两个,添加操作线程A如果操作子内存区域1,则使用lock1,操作子内存区域2时则使用lock2。添加操作线程A可以和删除操作线程1和删除操作线程2存在锁竞争,但是删除操作线程1和删除操作线程2之间不存在锁竞争。从运行情况来看,3个线程中至少有2个在同时运行,如果有N个子内存区域和N个删除操作线程的话,那么至少有N个线程在同时运行,因此这种锁竞争模式中,同样可以保证当CPU核数少于等于线程分组的个数时,不会发生CPU饥饿现象。队列池便是这种模式的一个很好的成功实践。

线程分组竞争模式是消除锁竞争造成多核CPU性能下降的最有效方式,它的性能近似于单核CPU中的多线程编程的性能,这种模式也是设计本地分布式数据结构的一种有效方法。

到此,关于“怎么理解多核编程中的线程分组竞争模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么理解多核编程中的线程分组竞争模式

本文链接: https://lsjlt.com/news/86417.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么理解多核编程中的线程分组竞争模式
    这篇文章主要介绍“怎么理解多核编程中的线程分组竞争模式”,在日常操作中,相信很多人在怎么理解多核编程中的线程分组竞争模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解...
    99+
    2024-04-02
  • 多核编程中的线程随机竞争模式的概率分析
    这篇文章主要讲解了“多核编程中的线程随机竞争模式的概率分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“多核编程中的线程随机竞争模式的概率分析”吧!并 不是...
    99+
    2024-04-02
  • 多核编程中的锁竞争现象分析
    这篇文章主要介绍“多核编程中的锁竞争现象分析”,在日常操作中,相信很多人在多核编程中的锁竞争现象分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”多核编程中的锁竞争现象分析”...
    99+
    2024-04-02
  • 怎么理解多核编程中的条件同步模式
    本篇内容介绍了“怎么理解多核编程中的条件同步模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在多线程编程...
    99+
    2024-04-02
  • Java编程中的并发索引算法:解决多线程竞争的问题?
    在Java编程中,多线程并发是一个常见的问题。在多个线程同时访问共享资源时,由于访问的顺序和时间不确定,就会产生竞争的问题。这种竞争会导致程序出现意想不到的结果,甚至引发严重的错误。为了解决这个问题,Java提供了一些并发算法来帮助开发者...
    99+
    2023-06-30
    索引 编程算法 并发
  • 怎么理解多核编程中的负载平衡
    本篇内容主要讲解“怎么理解多核编程中的负载平衡”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解多核编程中的负载平衡”吧!多核CPU中,要很好地发挥出多个C...
    99+
    2024-04-02
  • Java多线程中的Balking模式详解
    目录1.场景2.详细说明3.Balking模式的本质:停止并返回源代码如下:总结1.场景 自动保存功能: 为防止电脑死机,而定期将数据内容保存到文件中的功能。 2.详细说明 当数据内...
    99+
    2024-04-02
  • Android编程中关于单线程模型的理解与分析
    本文讲述了Android编程中关于单线程模型的理解与分析。分享给大家供大家参考,具体如下: 当一个Android程序启动时,Android系统会同时启动一个对应的主线程(Mai...
    99+
    2022-06-06
    模型 单线程 线程 Android
  • 怎么解析Redis6中的单线程和多线程模型
    这篇文章的内容主要围绕怎么解析Redis6中的单线程和多线程模型进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!1....
    99+
    2024-04-02
  • Java怎么实现多线程中的静态代理模式
    这篇文章将为大家详细讲解有关Java怎么实现多线程中的静态代理模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样...
    99+
    2023-06-15
  • Java中多线程Reactor模式怎么实现
    这篇文章主要讲解了“Java中多线程Reactor模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中多线程Reactor模式怎么实现”吧!多线程Reactor模式旨在分配多...
    99+
    2023-06-21
  • 怎么理解Redis中多线程
    这篇文章主要介绍“怎么理解Redis中多线程”,在日常操作中,相信很多人在怎么理解Redis中多线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Redis中多线程”...
    99+
    2024-04-02
  • C#中单例模式与多线程怎么用
    这篇文章给大家分享的是有关C#中单例模式与多线程怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、单例模式我们先来看看两种创建单例模式的示例代码。1、饿汉式 饿汉式创建单例模式是在程序里面直接初始...
    99+
    2023-06-29
  • Java多线程中Future设计模式怎么用
    这篇文章将为大家详细讲解有关Java多线程中Future设计模式怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Future -> 代表的是未来的一个凭据public interfac...
    99+
    2023-06-25
  • Java的Future多线程模式怎么使用
    本篇内容介绍了“Java的Future多线程模式怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Java5后,提供了大量处理多线程的...
    99+
    2023-06-17
  • Java多线程中读写锁分离设计模式怎么用
    小编给大家分享一下Java多线程中读写锁分离设计模式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!主要完成任务:read read 并行化read writ...
    99+
    2023-06-25
  • Java实现多线程中的静态代理模式
    前言 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 简言之,代理模...
    99+
    2024-04-02
  • Java中单例模式与多线程的示例分析
    这篇文章主要介绍了Java中单例模式与多线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。单例模式与多线程单例模式就是全局唯一但是所有程序都可以使用的对象写单例模式...
    99+
    2023-06-20
  • Java 多线程中的Thread该怎么理解
    这篇文章给大家介绍Java 多线程中的Thread该怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。package com.thread;public class TestThrea...
    99+
    2023-06-02
  • 如何理解CSS编程中的怪异模式
    今天就跟大家聊聊有关如何理解CSS编程中的怪异模式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。怪异模式盒模型今天学习了一下css3的box-siz...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作