并行计算
文章平均质量分 67
郝伟博士
郝伟,男,留日计算机博士,副研究员,硕士生导师。师从东京大学松崎公纪教授,主要研究方向为网络安全、并行计算与大数据,尤其是在网络环境下大数据安全性的研究。北京华云安信息技术有限公司首席研究员,中新网安技术研究员,上海莱镁晟信息科技有限公司技术顾问。参与国家973项目和国家科技重大专项各1项,主持国家科研项目1项,13项国家发明专利,各类论文25篇,合肥市政认定高层次人才。与清华大学、海克斯康、国防科技大学等多家单位有技术合作。
展开
-
示例说明多线程的两组概念:串行VS并行 和 并发VS顺发
网上关于并发(Concurrent)、并行(Parallel)和串行(Sequential),而且各种的解释大多不是很清楚,而且还有一些基于是错误的。本文就这几个概述概念通过一个具体的实例进行解释。原创 2022-05-11 08:13:17 · 1066 阅读 · 0 评论 -
使用TaskFactory类实现MapReduce功能
在多线程编程中,MapReduce是最为常用的一种模型。在C#中有TaskFactory类,可以实现此功能。本文就通过一个实例,介绍具体的工作原理。同时,还引入了CancellationTokenSource类,用于中止整个MapReduce任务。原创 2022-05-07 08:34:51 · 869 阅读 · 0 评论 -
多线程会占用大量的内存?NO,每个线程只会用几百KB内存。
文章目录1 问题描述2 测试原理3 测试数据4 测试结论附1:测试代码附2:一些测试图片1 问题描述今天讨论的时候,有人提出了这个的一个观点:多线程会占用大量的内存。事实上,前操作系统已经发展了半个多世纪,对多线程的调度已经达到了极高的效率,对CPU资源和内存资源的占用已经完全可以忽略。下面让我们通过一个测试来理解这个结论。2 测试原理在Windows操作系统下,启动10万个线程,比较前后内存的占用量,以计算出每个线程的内存占用情况。这里有几点注意:本测试结果不应该受语言影响,因为线程的调度原创 2020-09-23 20:46:50 · 5517 阅读 · 0 评论 -
单日志管理线程实现每秒百万级日志写入机制设计与实现
Logs.Length = 1048576 x 10logs[0].Length = 60Init: 530.61msSave: 7714.36ms130万条 60字节长度数据写入,文件大小 :620MBLogs.Length = 1048576 x 10logs[0].Length = 100Init: 527.56msSave: 9394.87ms106万条 1000字节长度...原创 2020-08-27 15:43:52 · 914 阅读 · 0 评论 -
一个自定义的C++线程安全的对象模板
简介在多线程操作中,为了避免对线程共享数据的操作冲突,一般会使用互斥锁,如 mutex。为了让结构更加合理,在本文中,作者利用模板,定义了一个通用的线程间操作安全的模板对象类。原理基本原理是使用模板支持不同的数据类型,然后在模板类中通过一个互斥锁,实现加锁和解锁操作,从而避免数据在多线程操作中的冲突。具体实现代码如下所示:// LockableObject.h#include <mutex> template <typename T>class LockableObj原创 2020-08-06 12:08:15 · 345 阅读 · 0 评论 -
在C#中使用Task类解决线程的等待问题
文章目录前言Task类示例小结前言在任何的编程语言中,面对耗时任务 TTT 时,我们都会有这样的需求:让 TTT 执行 n 秒,如果到时仍然完成不了,那么就不再等待。这样的代码如果自己写类来实现的话并不困难,然而实际上C#已经内置了Task类用于解决此问题。Task类Task是C#中专门用于接收任务的类,通过构造函数接收任务,使用start()方法启动。当任务启动以后,可以使用Task.WaitAll(Task[] tasks, int timeout) 等待所有任务完成后或时间到 timeout原创 2020-07-07 14:57:23 · 6399 阅读 · 0 评论 -
文本生成评价指标的进化与推翻
文章目录前言基于词重叠率的方法机器翻译 & 摘要 常用指标BLEUROUGENISTMETEORTERdata to text 常用指标relation generation (RG)content selection (CS)content ordering (CO)如何实现上述的评价指标CoverageDistinctimage caption 常用指标CIDEr好处SPICE词向量评价指标Greedy MatchingEmbedding AverageVector Extrema基于语言模型的转载 2020-07-01 14:52:31 · 575 阅读 · 0 评论 -
NLP词向量发展历程
文章目录1、tf-idf2、word2vec3、GloVe4、Fasttext5、ELMo6、OpenAI GPT7、BERT7.1 Bert 预训练7.1.1 输入7.1.2 训练任务7.1.3 训练细节7.2 Bert Fine-tune转载来源:https://zhuanlan.zhihu.com/p/108703757这篇文章记录词向量的发展历程,包括tf-idf、word2vec、GloVe、ELMo、OpenAI GPT以及Bert,只记录个人认为比较核心的内容,以及一些值得思考的边角细节转载 2020-06-19 14:06:22 · 506 阅读 · 0 评论 -
高效计算一个字节中所有的1的个数。
就如何高效计算一个字节中所有的1的个数的问题,本文提了三种方法。原创 2020-05-26 20:02:42 · 1924 阅读 · 0 评论 -
Java 多线程之 Future 接口
简介FutureTask是Future接口的实现。Future 代表了异步计算的结果(the result of an asynchronous computation),并提供相应的方法以检查计算是否完整或者是否等待等操作。 结果只能在计算完成时使用方法get检索,如果必要则阻塞直到准备就绪。 取消由取消方法执行。 提供了其他方法来确定任务是否正常完成或被取消。 一旦计算完成,计算就无法取消。...原创 2019-07-23 07:28:55 · 640 阅读 · 0 评论 -
Java 多线程之 Callable 接口
上次讲了Runnable接口,通过它可以定义需要执行的任务。但是这个任务是不返回结果的。所以很多人通过在类中添加公共字段的方式进行数据接收。实际上Java根据此需求已经提供了相应的接口,即Callable。定义由于返回类型是不确定的,所以Callable接口使用了泛型来定义返回类型,以下代码演示了使用Callable方法定义求 1+2+...+1001 + 2 + ... + 1001+2+....原创 2019-07-22 10:04:44 · 769 阅读 · 0 评论 -
Java多线程之 FutureTask:带有返回值的函数定义和调用
之前使用的方法都是没有返回值的。很多时候,我们是有返回值的,为了解决这个问题,Java提供了一个FutureTask 类,用于定义带有返回值的任务。以下代码演示了定义和调用的整个过程。import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;public class CallableDemo {...原创 2019-07-22 23:27:47 · 1456 阅读 · 0 评论 -
Java 多线程之 RunnableFuture<V>
https://www.cnblogs.com/dolphin0520/p/3949310.htmlpublic class FutureTask<V> implements RunnableFuture<V>// FutureTask类实现了RunnableFuture接口,我们看一下RunnableFuture接口的实现:public interface Runn...原创 2019-07-24 07:15:14 · 4079 阅读 · 2 评论 -
Java 多线程之 Runnable 接口
文章目录前言Runnable 接口简介实例教学单线程计算多线程实例Thread类的常用方法常用方法线程的生命周期线程状态变化前言前几日写过一篇文章入门级的《Java 多线程之 Thread类》,简单介绍了使用Thread类进行多线程计算的基本方法。由于Thread是线程类,需要将方法传入后才能执行。将了将线程和操作方法分享,Java提供了Runnable接口。本文将介绍Java中Runnabl...原创 2019-07-19 09:11:23 · 1047 阅读 · 0 评论 -
也谈 Java 中的 Thread.sleep(0)
有很多文章在说Java多线程中的 Thread.sleep(0)。本文也结合实例谈一谈这个话题。Thread.sleep(n) 的作用首先,我们知道即使是单核的CPU也是可以运行多任务的。这是因为操作系统采取将时间分片的方式,把不同的时间片分给不同的线程来做,而同一时间只有一个程序占有CPU的使用权(具体的背景请查阅相关文章)。所以 sleep 函数就是将当前线程挂起 n 毫秒后再恢复工作。由...原创 2019-06-29 17:02:59 · 1229 阅读 · 0 评论 -
Java 多线程之 Thread类
前言以前写过一篇文章《并行计算基础:通过一个修建隧道的例子理解并行计算》简单了并行计算的基本概念。本文将介绍最基本Java中的的多线程的实现办法。Thread类简介在Java中,提供了Thread类用于实现多线程,其实现原理非常易于实现。只要从Thread类中派生出来,然后重写其 run 方法即可。实例教学单线程计算我们先以一个非多线程处理的问题为例。在以下代码中,我们进行一个求和操作...原创 2019-07-12 18:13:39 · 684 阅读 · 0 评论 -
一个简单的办法保证Java并行计算的原子性
概念原子性是多线程是最基本也是最重要的要求之一,它的主要目的就是让一段代码在执行的过程中不会因为多个线程同时被执行而被打断顺序(请参见 Java多线程安全的三大特性之原子性)。举例来说,你在网上银行从1帐户转出100块钱到帐户2,这个操作就必需是一个原子操作,即从帐户1转出和向账户2转入要么一起完成,要么一起都不完成。因为网络延时或其他不确定因素导致的只有其中任意一个操作完成的情况是不允许的。...原创 2019-06-27 20:46:22 · 970 阅读 · 0 评论 -
Java 多线程之 ReentrantLock 的快速上手
在进行多线程操作中,为了保证操作块的原子性,最简单直接的方式就是使用以下代码:class ThreadDemo{ // 1. 定义一个全局boolean型变量 public boolean isOccupied = false; 定义一个全局变量 // 2. 在需要原子化的代码块前后使用 public void process(){ isOccupied = true; ...原创 2019-06-27 18:39:10 · 500 阅读 · 0 评论 -
Java多线程之 wait 和 join 的区别
本文不是介绍wait和join方法是什么或怎么用,而只是介绍两者的区别,具体两个函数的用法请参考相关文档。为了说明问题,编写了以下几行代码。package aust.hao.thread;import java.text.SimpleDateFormat;import java.util.Date;public class Demo extends Thread { publi...原创 2018-12-05 11:52:29 · 2354 阅读 · 0 评论 -
Java 使用多线程对超大数列进行累加计算
实验目的:验证Java的大数据多线程的处理能力实验原理:建立一个长为2G (Java中最大长度为2G) 的整形数组,分成n份,然后让n个线程来对每一块进行求和,最后将每一块的各累计起来统计时间。实验设备:Xeon E5-2600v2 @ 2.2 GHz (20 cores, Hyper-threading off) X 2, DDR3 1600MHZ 128 GB, SSD 512GB.实验...原创 2019-01-19 16:49:27 · 2041 阅读 · 0 评论 -
Semaphore学习笔记
在多线程操作中,如何处理资源竞争是非常常见的一个问题。资源的数量如果是单个,Java中有很多种方法可以进行处理,但是如果有多个资源的情况,如在银行处理业务时,顾客和工作人员都有很多,但是窗口却是有限的,应当如何处理呢?为了解决这个问题,Java多线程包中,提供了 java.util.concurrent.Semaphore 以解决以此问题。下面通过一个示例来说明(代码在最下方,先直接看结果)。...原创 2019-02-01 10:43:45 · 751 阅读 · 0 评论 -
基于多线程的高性能异步日志管理机制与实现
通常在日志写的过程,每次写日志时,都是直接写入文件中。当数据量不大的时候,完成可以这样做,不会有什么问题。但是当数据量大时,每次写数据则会由于IO的瓶颈造成很大的性能问题。为了解决这个问题,本文设计了一套基于多线程的在内存中追加日志后再写入文件的缓冲机制,从而解决这个问题。基本原理内存日志列表首先建立一个缓冲列表用于保存日志。当日志在生成以后,先写入缓冲中,从而利用高速的内存可以以极高的...原创 2019-05-12 13:11:19 · 1045 阅读 · 0 评论 -
分治法之并行计算(附多台机器测试结果)
机器列表测试结果线程数123456机器1 (6T)545327381826138911171004日志以下为所有配置的日志信息机器1c:\java\javac ParallelDemo.java && java ParallelDemo 1ID: 0 finished in 5453 ms.Time: 5453 ms. ...原创 2019-05-29 08:12:39 · 1768 阅读 · 0 评论 -
Java多线程安全的三大特性之原子性
定义原子性就是一个等执行的任务象原子一样不可拆分(注:这是早期的观点,现在物理学已经发现原子实际上也是可分的,不过原子性概念已经用了很久,大家都已经接受了,所以不再修改。),即要么全部执行完不会被打断,要么会都不执行。以银行转账举例来说,现在储户A转账1000元给储户B,那么这里有两个操作,即从储户A的账户减去1000元和向储户B帐户增加1000元。这个任务就必需要求是原子性的,即要么这两个操作...原创 2019-06-15 07:29:42 · 827 阅读 · 0 评论 -
线程死锁及一个通俗的示例
定义死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。举例办公室有一台公用的电脑用于查询资料,还有一台公用打印机用于打印。一天,Tom自己临时需要使用一下公用电脑,并用它打印一份材料;但是不巧的事,此时打印机已经损坏,而Jack正在维修...原创 2019-06-20 14:42:13 · 943 阅读 · 0 评论 -
Java多线程安全的三大特性之可见性
定义在多线程的程序中,变量不再和单线程一样那么可靠,可以简单地的设置和读取变量的值。这是因为,Java是高级语言,既便是最简单的 i++; 在实际执行的时候,都会因为翻译成底层的机器语言,而变成不止一条语句,而在CPU最终执行的时候,情况还会变得更加复杂。所以,在多线程执行的时候,往往会出现很多意想不到的结果。请看下面的代码:可见性指的是一个变量对所有的CPU都可见。从物理结构来看,CPU内的...原创 2019-06-11 11:33:04 · 778 阅读 · 0 评论 -
Java多线程安全的三大特性之有序性
定义有序性是指,同一线程中的指令应该按顺序执行,而多线程中的指令未必按顺序执行。示例在下面的演示代码中,我们做了这样的事情:首先,定义一个全局的静态变量 singleton ,使用1000个线程对调用 getInstance()操作,如果 getInstance() 是按顺序执行,那么只有一个线程能够执行构造函数,然而结果显示输出为(行数不固定):Constructor of Singl...原创 2019-06-16 18:39:35 · 1214 阅读 · 0 评论 -
Java 多线程中 join 的作用
背景在使用多线程操作时,有这样的一个操作非常常见:当我们遇到一个任务比较繁重时,我们会分配一个子线程 t 去执行,从而使主线程仍然继续处理当前事务。然而当主线程处理好好其他事务后,发现子线程仍然没有结束,于是主线程就需要等待子线程执行完成。问题这里就会有这个的一个问题:主线程如何知道子线程执行已经结束了?一些对Java不太了解的初级程序员通常的作法就是在主线程中使用一个循环去检测子线程的状态...原创 2019-06-21 19:41:24 · 3045 阅读 · 0 评论 -
并行计算基础:通过一个修建隧道的例子理解并行计算
前言为了便于初学者理解并行的思想,本文通过一个隧道并行推进的示例,让大家理解并行计算的基本思想。示例假设在两地间需要需要修改一个非常长的隧道。隧道的推进,最容易实现的方式就是从两端开始,但是如果仅从两端左右开采肯定是最节省建设成本的,工期需要的时间会比较长。由于隧道是收费的,所以如果可以每提前一年,就会多带来一年的收益。因此,为了提高进度,加快验收时间,我们需要采取并行的方式进行隧道开采。最...原创 2019-06-22 18:45:59 · 860 阅读 · 0 评论 -
Java多线程教程(添加完善中……)
基础如果你想快速体验多线程,那么请看这个教程《快速实现Java的多线程》,如果你想深入理解Thread 类Runnable 类进阶:线程池进阶:线程同步线程安全的三大特性Java多线程安全的三大特性之有序性Java多线程安全的三大特性之原子性Java多线程安全的三大特性之可见性应用实例分治法之并行计算(附多台机器测试结果)Semaphore学习笔记Java多线程之 wai...原创 2019-06-26 12:20:10 · 548 阅读 · 0 评论 -
Java 线程安全关键字 synchronized (2)
前言本示例中,我们使用2个线程对使用 synchroized 几个方法进行调用,对一个静态变量进行指定次数自加操作,但是最终的结果却与自加次数不相等。通过对这些不同的分析,让我们对 synchronized 关键字在操作函数时,有了更加深入的认识。问题1 结果的值远大于预期在以下的代码中, 我们定义了一个全局的queue 和全局的 value,然后使用两个线程在value小于10000的情况...原创 2019-06-26 16:23:21 · 573 阅读 · 0 评论 -
Java 线程安全关键字 synchronized (1)
https://blog.csdn.net/topdeveloperr/article/details/80485900简介原理monitor entrymonitor exit应用场景售票窗口问题用法函数块代码块优化锁消除锁粗化偏向锁轻量级锁其他注意事项...原创 2019-06-27 05:55:23 · 752 阅读 · 0 评论 -
一个简单的例子让你快速了解什么是单线程、多线程和线程池
现在有很多文章对多线程和线程池都有解释,但是大多是比较生涩的专业术语,让初学者很是难懂。本文以一个实际的示例来进行解释,让你很快就了解三者的作用和区别。原创 2018-11-28 17:20:37 · 1161 阅读 · 0 评论