在做NDK开发的时候,很多情况下都是需要使用多线程的,一方面是提高程序运行效率,另一方面就是防止主线程阻塞 C的多线程 在C语言里,可以通过对于POSIX标准的运用,使得C语言执行多线程 提高程序的执行速度,以及对资源的合理利用 POSIX POSIX原理 POSIX可以让C语言实现多线程 其实现是是通过POSIX函数库的调用实现的 POSIX函数库可以看作是C语言库函数的超集,对C语言尽行了增强 POSIX实现多线程 在C语言中调用POSIX库函数可以实现多线程 在使用时,需要包含pthrea…
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条线程访问,一条线程在执行一个循环的过程中被中断,下一个线程则出现错误 因此,线程任务中可能引起错误的地方应当被一次执行完毕 同步代码块 用同步代码块改写上面的代码 package testpack; public class Test1 { public static void main(Strin…
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行的代码 继承java.lang.Thread创建线程 public class Test1 { public static void main(String[] args){ System.out.println("现在是主线程: "+Thread.currentThread()); //…
Java的多线程实现生产/消费模式 在Java的多线程中,我们经常使用某个Java对象的wait(),notify()以及notifyAll() 方法实现多线程的通讯,今天就使用Java的多线程实现生产/消费模式,需求如下: 线程A ProductThread 继承Thread 实现生产数据 若线程共享的数据不为NULL,则生产线程进入等待状态 线程B CustomThread 继承Thread 实现消费数据(输出到控制台) 当线程共享数据为NULL的时候,进入等待状态 线程B 消费完数据之后,…
之前我们学习使用TensorFlow对图像数据进行预处理的方法.虽然使用这些图像数据预处理的方法可以减少无关因素对图像识别模型效果的影响,但这些复杂的预处理过程也会减慢整个训练过程.为了避免图像预处理成为神经网络模型训练效率的瓶颈,TensorFlow提供了一套多线程处理输入数据的框架. 下面总结了一个经典的输入数据处理的流程: 下面我们首先学习TensorFlow中队列的概念.在TensorFlow中,队列不仅是一种数据结构,它更提供了多线程机制.队列也是TensorFlow多线程输入数据处理…
之前的视频解码仍然存在问题,那就是是在主线程中去完成解码的,会造成线程阻塞,这里将其改为多线程解码,使其主线程不被阻塞 前面介绍了音视频的主线程解码,那样会阻塞主线程,在前面学习了多线程以后,就可以对音频和视频分离开来在子线程里解析了,但这样存在音视频同步的问题了,这里贴出代码,只是提供一种思路,其运行存在大量问题,还需要慢慢解决.例如,退出发生异常,音视频不同步 #include <android/log.h> #include <stdio.h> #include <st…
目前在做推理引擎开发相关的工作,这块内容的话,对工程能力的要求还是比较高的,不再像以前只是写一些Python脚本训训模型就可以了,而且深入了解C++之后,也能感受到Python较C++暴露出的缺点,另一方面,由于模型推理所需的高效性,目前推理引擎的开发基本上都是用C++来实现,而且其中绕不开的一个难点就是多线程.这个系列我打算将我学习C++多线程开发的历程整理成文章,梳理相关知识点并整合到已有的知识体系中. 1. 线程和进程 线程和进程是操作系统的概念,这部分知识应该在学CSAPP的时候能够学习…
前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实现中,直接调用pthread的多线程方法,这样就可以在JNI层实现多线程,下面是一个简单的实现多线程的例子 #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <android/l…
学习多线程首先先要理解线程和进程的关系. 进程 计算机的程序是储存在磁盘中的可执行的二进制文件,执行时把这些二进制文件加载到内存中,操作系统调用并交给处理器执行对应操作,进程是程序的一次执行过程,这是一个动态的概念程序本没有生命的实体,只有通过处理器才能赋予程序生命.进程最大的特点就是可以申请和拥有系统资源,这是一个动态的概念,是一个活动的实体(比如qq程序需要的内存空间等等),进程不止是程序代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示. 而线程是进程的一部分,一个进程可以…
首先NDK文档中的Op.h头文件中已经有了相关概念的解释,摘录翻译如下: /*! \fn const OutputContext& Op::outputContext() const; The current context that this Op is supposed to produce a picture for. This includes the frame number, the view, etc. */ const OutputContext& outputContex…
最近的NDK开发涉及到了动态input及动态knobs的问题. 开发需求如下:建立一个节点,该节点能获取每一个input上游的inputframerange信息. 具体下来就是:需要Node的input可以不断增加,而不是固定的几个:而knobs的数量也与input数量同步. 查了nuke提供的开发工具,动态input数量的问题已经解决了,本文主要谈DynamicKnobs的机制. DynamicKnobs.cpp的机制相对较复杂,涉及到三个方面: 一: void DynamicKnobs::k…
1.创建多线程方式1——继承Thread类. 步骤:  A:自定义类MyThread继承Thread类.  B:MyThread类里面重写run()? 为什么是run()方法呢? C:创建对象 D:启动线程 /* 方式1:继承Thread类. * 步骤 * A:自定义类MyThread继承Thread类. * B:MyThread类里面重写run()? * 为什么是run()方法呢? * C:创建对象 * D:启动线程 */ public class MyThread extends Threa…
run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为线程是一个独立运行的代码片段,它的问题不能影响到其他线程 如果run()内部抛出一个unchecked异常,这个线程可能会终止运行,这个异常也不能被主线程捕获,也影响不到其他线程的执行,比如下面的示例: package testpack; import java.io.IOException; pu…
join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long millis):等待millis毫秒 join(long millis,int nanos):很少用,等待毫秒+毫微秒 看示例: package testpack; public class Test2 { public static void main(String[] args) throws…
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同.相当于存取款交替进行,金额相同. 线程间通信,需要通过同一个同步监视器(也就是this或者显式的Object对象)调用通信方法, Object有三个方法,可以用于线程间通信 wait() 当前线程等待,并释放同步锁 wait():无限期等待 wait(long timeout):等待timeout…
针对每一种后缀名Nuke都提供了对应的模块.为了决定用哪个版本的reader或writer模块,Nuke会先解析文件后缀名再以此为依据调用相关模块. 以JPG为例: 该文件格式有两种后缀名:.jpg和.jpeg.实际上两种后缀名用同一个模块来解决即可.Nuke中用tcl脚本来解决这个问题.Nuke文件路径中有这样一个文件:jpegReader.tcl,内容如下: #jpegReader.tcl load jpgReader 当Nuke主程序解析后缀名为.jpeg的时候就会调用jpegReader…
花了点时间把pixeliop的部分看完了,拿到开发文档提供的案例稍事修改,把画面左半边压暗. 这个案例重点在于理清pixel_engine()函数中的坐标与scanline的关系. y代表当前正在调用的行高,x代表该行左头坐标,r代表该行右头坐标,foreach循环会逐通道执行内部代码块,inptr是Row类型的输入指针,outptr是Row类型的输出指针,赋值结果是inptr指针与outptr指针指向当前操作行的左边起始位置,END指针指向当前操作行的右边结尾位置. 左半边的循环亮度衰减0.5…
1. 多线程场景下尽量使用并发容器代替同步容器 (如ConcurrentHashMap代替同步且基于散列的Map, 遍历操作为主要操作的情况下用CopyOnWriteArrayList代替同步的List) ConcurrentHashMap:分段锁机制,多线程条件下优于HashMap+synchronized的组合方式: CopyOnWriteArrayList: 每次修改时都会创建并重新发布一个新的容器副本,从而实现可变性.容器的迭代器保留一个指向底层基础数组的引用,这个数组当前位于迭代器的起…
在多线程程序执行过程中,可能会涉及到两个或者多个线程试图同一时候訪问同一个资源.为了防止这样的情况的发生,必须在线程使用共享资源时给资源"上锁",以阻挡其他线程的訪问. 而这样的机制也经常被称为相互排斥量.本文主要介绍它的两种方式synchronized和Lock . 1.synchronized 当任务要运行被synchronizedkeyword保护的代码片段的时候,它会检查锁是否可用,然后获取锁.运行代码.释放锁.synchronized也有两种使用方法: A.synchroni…
1.导致出现安全问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 2.解决线程安全问题方法: 同步代码块: synchronized(对象){ 需要同步的代码;  }  A:对象是什么呢?   可以使任意对象.  B:需要同步的代码是哪些呢?   把多条语句操作共享数据的代码的部分给包起来 注意: 同步可以解决安全问题的根本原因就在那个对象上.该对象如同锁的功能. 多个线程必须是同一把锁. 3.同步的特点:  前提: 多个线程 解决问题的时候要注意: 多个线…
1:要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在. 2:什么是进程? 通过任务管理器我们就看到了进程的存在. 而通过观察,我们发现只有运行的程序才会出现进程. 进程:就是正在运行的程序. 进程是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 3:多进程有什么意义呢? 单进程的计算机只能做一件事情,而我们现在的计算机都可以做多件事情. 举例:一边玩游戏(游戏进程),一边听音乐(音乐进程). 也就是说现在的计算机都是支持多进…
虽然现在有插件化开发和热修复,但为何还需要增量更新?插件化开发和热修复依赖于宿主程序,增量更新适合更新宿主程序. 差分包生成的前提 差分包的生成依赖于BsDiff开源项目,而BsDiff又依赖于Bzip2 BsDiff源代码下载地址:BsDiff Bzip2源代码下载地址:Bzip2 Window服务器端配置 新建Java Web项目 new -> Web -> Dynamic Web Project 由于我本地装的是tomcat 7,这里就选择Apache Tomcat v7.0 在src目…
文件的拆分与合并在开发中经常会用到,上传或是下载的时候都有这样的运用 文件拆分的思路 将文件大小拆分为n个文件 那么,每个文件的大小就是等大小的 如果文件大小被n除不尽,那么就使用n+1个文件来拆分 最后一个文件的大小就是整除不尽的那一部分数据 文件合并的思路 将拆分出来的全部文件胺顺序读取 挨个数据写入到指定文件中 所有文件数据写入完毕 那么合并就完成了 代码实现 布局文件(activity_main.xml) <LinearLayout xmlns:android="http://sc…
本文主要是说明一下在eclipse下如何对NDK进行配置 配置NDK 虽然现在基本上都使用Android Studio进行Android开发,但一些项目在eclipse中仍有运用,这里讲一讲eclipse的NDK配置 在最开始下载的adt里面是没有NDK这个选项的,那么就要进行配置,手动安装 eclipse界面下Help -> Install New Software... -> Work with 输入 https://dl-ssl.google.com/android/eclipse/,点…
本文简要回顾了C语言的一些注意事项和理解细节,不再赘述C语言的所有语法 头文件 头文件作为引入文件,在编译的时候,加载到源代码,参与编译 在VS2013中可以看到,当引入头文件时候,只能看到函数的声明,其实现是在编译时候查找的 C的动态库函数不可重名,而C++可以,这是因为C++有命名空间的存在,而C没有 //引入头文件 #include <stdio.h> void main() { printf("%s", "test"); } 基本数据类型 C中的…
创建和等待多个线程 数据和共享问题分析 只读的数据 有读有写 其他案例 共享数据的保护案例代码 创建和等待多个线程 服务端后台开发就需要多个线程执行不同的任务.不同的线程执行不同任务,并返回执行结果.很多个线程都用同一个线程入口: void myprint(int num) { cout << "线程开始执行了: " << num << endl; cout << "My print id: "<<this…
什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任务传递进去,任务执行完毕不终止线程,等待下一个任务 线程池的种类 ExecutorService: 这是个接口,代表尽快执行的线程池,只要有空闲进程,就立即执行 Future<?> submit(Runnable task) 将Runnable对象提交给线程池,线程池有空闲线程时执行任务,返回的F…
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行的代码 继承java.lang.Thread创建线程 package testpack; public class Test1 { public static void main(String[] args){ System.o…
rollenholt的博文:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html 弹球例子: 0. 创建Bounce框架 JFrame frame = new BounceFrame();    BounceFrame自定义了addButton.addBall方法,用于在frame内的panel添加按钮.小球 1. 设置标题 setTitle("bounce");2. 创建BallComponent comp…
相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: (1)在訪问该资源之前须要首先申请相互排斥锁,假设锁处于开状态,则申请得到锁并马上上锁(关),防止其它进程訪问资源,假设锁处于关,则默认堵塞等待. (2)仅仅有锁定该相互排斥锁的进程才干释放该相互排斥锁. 相互排斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadty…