thread

用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口

≯℡__Kan透↙ 提交于 2019-12-07 14:11:41
OpenGL 相关的工具库中的OpenGL程序往往都是在C函数main中初始化和创建的,使用控制台来完成显示和控制颇为不便。如果能够在MFC中OpenGL函数并创建OpenGL窗口,并且可以将控制参数传入给OpenGL则可以得到很好的交互性能。自己查找很多文献资料,貌似都是说要在MFC中显示OpenGL都是通过微软的wgl扩展来完成,但是wgl很早就停止更新了的并且自己写的wgl运行框架尽管有些时候可以使用但在自己的电脑上却总是发现有运行有内存泄漏的问题并且加载opengl程序也非常慢,也许是显卡驱动的问题?但自己装的英伟达的GTX560显卡并且是最新的显卡驱动,也还是存在这个问题,看来应该是自己写的和参考的wgl框架有bug。本来是想用glut的却发现也是很久就停止更新了,只有freeglut不错,今年初还出了更新的。于是决定使用glew+freeglut来实现这个想法。 不过有一个问题就是 glut 的初始化函数往往都是写的 glutInit(&argc,argv); 其中 argc 和 argv 两个参数是从控制台下的 C 函数的 main(int argc,char *argv[]) 中传过来的, argc 记录的是命令行中输入参数的数目, argv 是一个拥有 argc 个元素的字符串数组,每个元素保存一个命令行中输入的参数。但是在 MFC 中默认是不会生成控制台窗口的

CLozure CL 多线程函数使用实例

大城市里の小女人 提交于 2019-12-07 12:52:57
CLozure CL 多线程函数使用实例 一、简单介绍 Common Lisp 的标准没有对多线程的描述,因此各种 CL 实现都给出了自己的多线程功能函数,具体细节有所不同,这里大致讲解一下 Clozure CL 的多线程函数的简单用法(参照 CCL 的描述文档中多线程部分 第7章 Programming with threads)。 我在阅读CCL文档时被搞晕了,发现找不到线程对象作为参数的正确写法,后来经过 cn-lisp 的朋友指点,才发现不存在所谓的正确写法,只能把线程对象绑定到全局变量上使用,估计有人在学习 CCL 的多线程时会遇到类似的问题,所以这里把我的一点学习体会记录下来,希望能对其他初学者有所助益,帮助其他人少走些弯路。 二、CCL 线程函数基本知识 1、首先介绍几个线程相关的全局变量: 【全局变量】当前线程:*current-process* 在 ccl 中执行如下: Welcome to Clozure Common Lisp Version 1.8-store-r15418 (DarwinX8664)! ? ? *current-process* #<COCOA-LISTENER-PROCESS Listener(15) [Active] #x30200108839D> ? 其中 #< . . . > 是线程对象的表示方式,第一列表示线程类型

Thread --- lock/sychronized

眉间皱痕 提交于 2019-12-07 11:44:41
从实现角度来说 : sychronied 关键字是JVM层实现的,由其提供内置的锁。而lock方式必须被显示的创建 从代码角度来说 lock方式,代码缺乏优雅性。sychronized代码更加简洁,代码量少。 从使用角度来说 lock方式更加灵活,但是只有在解决特殊问题的时候才会使用。 用sychronized关键字不能尝试着获取锁且最终获取锁会失败,或者尝试着获取锁一段时间,然后放弃它,要实现这些必须使用lock方式。 使用sychronized关键字时,如果某些事务失败了,那么就会抛出异常,由JVM自动释放线程资源,但是你无法也没有机会去做任何的清理工作,以维护系统使其处于良好的状态。使用显示的Lock方式,你就可以使用finally子句将系统维护在正确的状态了。 显示的Lock对象在加锁和释放锁方面,相对于内建的sychronized锁来说,还赋予了你耕细粒度的控制力。 从性能角度来说 : 在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态 来源: oschina 链接: https://my.oschina.net/u/1018641/blog/539974

CopyOnWriteArrayList详解

纵饮孤独 提交于 2019-12-06 09:28:42
CopyOnWriteArrayList是 ArrayList 的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。 这一般需要很大的开销,但是当遍历操作的数量大大超过可变操作的数量时,这种方法可能比其他替代方法 更 有效。在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时,它也很有用。“快照”风格的迭代器方法在创建迭代器时使用了对数组状态的引用。此数组在迭代器的生存期内不会更改,因此不可能发生冲突,并且迭代器保证不会抛出ConcurrentModificationException。创建迭代器以后,迭代器就不会反映列表的添加、移除或者更改。在迭代器上进行的元素更改操作(remove、set和add)不受支持。这些方法将抛出UnsupportedOperationException。 允许使用所有元素,包括null。 内存一致性效果:当存在其他并发 collection 时,将对象放入CopyOnWriteArrayList之前的线程中的操作 happen-before 随后通过另一线程从CopyOnWriteArrayList中访问或移除该元素的操作。 这种情况一般在多线程操作时,一个线程对list进行修改。一个线程对list进行fore时会出现java.util

Android 异步加载解决方案

陌路散爱 提交于 2019-12-05 13:11:40
Android 的 Lazy Load 主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。在介绍 Android 开发过程中,异步处理这个常见的技术问题之前,我们简单回顾下 Android 开发过程中需要注意的几个地方。 Android 应用开发过程中必须遵循单线程模型 (Single Thread Model) 的原则。因为 Android 的 UI 操作并不是线程安全的,所以涉及 UI 的操作必须在 UI 线程中完成。但是并非所有的操作都能在主线程中进行,Google工程师在设计上约定, Android 应用在 5s 内无响应的话会导致 ANR(Application Not Response) ,这就要求开发者必须遵循两条法则: 1 、不能阻塞 UI 线程, 2 、确保只在 UI 线程中访问 Android UI 工具包。于是,开启子线程进行异步处理的技术方案应运而生。 本文以自定义 ListView ,异步加载网络图片示例,总结了 Android 开发过程中,常用的三种异步加载的技术方案。 相关资源: AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.doodle

java多线程编程之Future/FutureTask和Callable

夙愿已清 提交于 2019-12-04 20:25:32
有这样一种场景,用多线程发送数据到某个服务器,需要知道各个线程是否都发送成功,等所有线程都发送完成才能继续下一轮计算和发送。如果用传统的多线程方式,就需要启动多个线程,然后在每个线程中分别发送数据,外部通过某种方式等待各个线程全部都发送完成,再进行后面的计算等流程。这种实现方式的代码会比较臃肿,在java中提供了一种Callable+Future的方法,可以将异步的多线程调用变为同步方式。 Callable 在java的多线程编程中,有Thread和Runnable两种方式来新建线程,其中Runnable封装了一个异步运行的任务,可以认为是一个没有任何参数和返回值的异步方法。Callable接口类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的,不同之处在于: Runnable不会返回结果,并且无法抛出经过检查的异常。而Callable是有返回结果并且可能抛出异常的。 Runnable定义了run方法,而Callable定义了一个不带任何参数的叫做call的方法。 此外,Callable接口的类型参数也是返回值的类型。 public interface Callable { /** * Computes a result, or throws an exception if unable to do so. * * @return computed

JAVA CONCURRENCY EXECUTORS 介绍Java并发处理线程池

我怕爱的太早我们不能终老 提交于 2019-12-04 18:51:51
I would make a fool out of myself if I tell you that util.concurrent APIs kicks cheetah's ass when the classes are available since 2004. However, there are some cool features which I would like to revisit. Concurrency experts, now is the time for you to close this window. All others, stay tight for the fun ride. Thou shall not forget your roots Executor is the root interface with a single execute method. Anything that implements a Runnable interface can passed as a parameter. Silly Executor, however, has no support for Callable though. Good news : ExecutorService interface, which extends

Java Thread及其synchronized,wait,sleep,join,yeid,interrupt

浪子不回头ぞ 提交于 2019-12-02 09:05:48
Java SE7 API - Thread: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield%28%29 参考资料: http://blog.csdn.net/lqqmisslll/article/details/54208491 一、线程的简介 当JVM启动的时候, 通常会有一个独立的非守护线程(也就是类中的main方法所在的线程).JVM会继续运行,除非发生以下情况: Runtime类的exit()方法被调用,并且安全管理者允许退出发生。 所有非守护线程都已经死了,不管是从run方法中返回的还是因为run方法中抛出了异常。 注意:当所有非守护线程都执行结束(包括主线程),那么守护线程也会退出。因为守护线程是无法脱离非守护线程而独自存在的。 二、创建线程有两种方式: 方法1:声明一个类作为Thread的子类(extends Thread),子类重写(override)Thread类的run()方法。子类的实例可以被分配和start。 //比如:该线程用来计算比指定起始值大的素数。 class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; }

深入ThreadLocal的内部机制

守給你的承諾、 提交于 2019-12-01 21:37:32
深入ThreadLocal的内部机制 早在 JDK 1.2 的版本中就提供 java.lang.ThreadLocal , ThreadLocal 为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal 并不是一个 Thread ,而是 Thread 的局部变量。当使用 ThreadLocal 维护变量时, ThreadLocal 为每个使用该变量的线程提供独立的变量副本。 ThreadLocal 的接口方法: void set(Object value) :设置当前线程的线程局部变量的值。 public Object get() :该方法返回当前线程所对应的线程局部变量。 public void remove() :将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是 JDK 5.0 新增的方法。 需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收, 所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。 protected Object initialValue() :返回该线程局部变量的初始值,该方法是一个 protected 的方法,显然是为了让 子类覆盖 而设计的。 这个方法是一个延迟调用方法,在线程第 1 次调用 get() 或 set(Object)

Java多线程基础篇(02)-多线程的实现

99封情书 提交于 2019-12-01 05:29:15
1.概要 JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。本节,我们将探讨常用的实现多线程的2种方式:Thread和Runnable。至于第三种ExecutorService、Callable、Future的实现是属于java.util.concurrent包下的内容,我将单独设置一节去探讨。 2.Runnable简介 2.1 Runnable概述 Runnable是一个接口,该接口只包含了一个run无参方法。设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread类实现了Runnable。激活的意思是说某个线程已经启动并且尚未停止。 此外Runnable为非Thread子类的类提供了一种激活方式。通过实例化某个Thread实例并将自身作为运行目标,就可以运行实现Runnable的类而无须创建Thread的子类。大多数情况下,如果只想重写run()方法,而不重写其他Thread方法,那么应使用Runnable接口。 这很重要,因为除非程序猿打算修改或增强类的基本行为,否则不应该创建子类。 2.2 Runnable源码 package java.lang; public