多线程4

Qt4 http多线程程序 Qt4的多线程使用方法比较特殊,也使得编写多线程程序变的很简单,yo 阅读详情

死锁

  想获取到第二把锁,就需要执行完第一层大括号,想要执行完第一层大括号,就要先获取到第二层的锁。

synchronized (counter2){
synchronized (counter2){

   }
}

例子:t2先启动,t2进行加锁后一定成功,但是如果t2进行二次加锁的时候因为counter2已经被锁定了,所以他需要外层大括号的counter2进行解锁,但是这又是加锁操作,所以就会一直阻塞等待,于是就矛盾了,产生了对峙的画面(狗咬狗不松口)。

"引用计数"

可重入锁,防止程序员搞成死锁。

如何判定,当前遇到的}是最外层的}??JVM 是咋知道的??

更简单的办法,就是给锁对象里也维护一个计数器

每次{n++,每次遇到},n--。

就相当于当自己的锁给自己的锁加锁的时候就会形成嵌套锁的时候,就会防止形成嵌套锁的情况,

synchronized不存在问题,idea没必要提示~~

死锁的场景

 场景一:锁是不可重入锁,并且一个线程针对一个锁对象,连续加锁两次通过引入可重入锁,问题就迎刃而解了,九月场景一是锁不住的对吧

场景二:两个线程两把锁

有线程1和线程2,以及有锁A和锁B

现在,线程1和2 都需要获取到锁A和锁B

拿到锁A之后,不释放A,继续获取锁B

先让两个线程分别拿到一把锁,然后在去尝试获取对方的锁

public class Test2 {
  
    public static void main(String[] args) throws InterruptedException {
    Object o1= new Object();
    Object o2= new Object();
    Thread thread1=new Thread(()->{
        synchronized (o1){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            synchronized (o2){
                System.out.println("两把锁");
            }
        }
    });
    Thread thread2=new Thread(()->{
synchronized (o2){
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    synchronized (o1){
        System.out.println("两把锁");
    }
}
    });
    thread2.start();
    thread1.start();
    thread1.join();
    thread2.join();
        System.out.println("结束");
    }
    
}

这会产生死锁状态。

场景三:N个线程,M把锁

死锁的四个必要条件 !!!

1.锁具有互斥特性.(基本特点,一个线程拿到锁之后,其他线程就得阻塞等待)

2.锁不可抢占(不可被剥夺) 一个线程拿到锁之后,除非他自己主动释放锁,否则别人抢不走~~

3. 请求和保持,一个线程拿到一把锁之后,不释放这个锁的前提下,再尝试获取其他锁!

4.循环等待.  多个线程获取多个锁的过程中,出现了循环等待. A 等待 B,B 又等待 A.

必要条件:缺一不可任何一个死锁的场景,都必须同时具备上述四点只要缺少一个,都不会构成死锁

public class Test2 {

    public static void main(String[] args) throws InterruptedException {
    Object o1= new Object();
    Object o2= new Object();
    Thread thread1=new Thread(()->{
        synchronized (o1){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            synchronized (o2){
                System.out.println("两把锁");
            }
        }
    });
    Thread thread2=new Thread(()->{
synchronized (o1){
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    synchronized (o2){
        System.out.println("两把锁");
    }
}
    });
    thread2.start();
    thread1.start();
    thread1.join();
    thread2.join();
        System.out.println("结束");
    }

}

约定每个哲学家,必须先获取编号小的筷子,后获取编号大的筷子~
 

内存可见性

import java.util.Scanner;

public class Test3 {
    public static int   count=0;
    public static void main(String[] args) {

            Thread thread=new Thread(()->{
                while (count==0){

                }
                System.out.println("t1 执行结束");
            });
            Thread thread1=new Thread(()->{
                Scanner scanner=new Scanner(System.in);
                 count=scanner.nextInt();
            });
            thread1.start();
            thread.start();
    }
}
import java.util.Scanner;

public class Test3 {
    public static int   count=0;
    public static void main(String[] args) {

            Thread thread=new Thread(()->{
                while (count==0){

                }
              
            });
            Thread thread1=new Thread(()->{
                Scanner scanner=new Scanner(System.in);
                 count=scanner.nextInt();
            });
            thread1.start();
            thread.start();
    }
}

代码转换为下面的时候就会一直进入无限循环,不能跳出循环。

由于系统自带简化

while (count==0){

}
会load从内存读取数据到cpu寄存器cmp(比较,同时会产生跳转)条件成立,继续顺序执行条件不成立,就跳转到另外一个地址来执行。

但是循环过快的时候,load循环速度慢,执行load的时间使上万次的cmp执行效率。

所以就把load优化掉了,专业昂就不会进行判断,这样就会使效率提高

上述问题本质上还是编译器优化引起的.优化掉load操作之后,使t2线程的修改,没有被t1线程感知到“内存可见性”问题

volatile

是告诉编译器,不要触发上述优化

如何解决上述内存可见性问题??就内存可见性问题来说,可以通过特殊的方式来控制,不让它触发优化的volatile关键字。

volatile是专门针对内存可见性的场景来解决问题的,并不能解决之前,两个线程循环count++的问题

引l入synchronized其实是因为加锁操作本身太重量了.相比于load来说,开销更大,编译器自然就不会对load优化了.(和加上sleep/io操作)

当t1执行的时候,要从工作内存中读取count的值,而不是从主内存中.后续t2修改count,也是会先修改工作内存,同步拷贝到主内存.但是由于t1没有重新读取主内存,导致最终t1没有感知到t2的修改.

 线程等待通知机制

系统内部,线程是抢占式执行,随机调度.程序员也是有手段干预的.通过“等待”的方式,能够让线程一定程度的按照咱们预期的顺序来执行。

例子:在ATM机取钱的时候,如果1号去取钱,但是ATM正好没钱,这时候2号再进去取钱,就会产生频繁的没有意义的系统调度,cpu永远在做无效的工作,就会影响效率。

这时候就需要应用线程等待的方法,查看当前的逻辑是否能执行,如果不能执行就主动wait,避免造成无效工作,等待后续时机成熟(ATM有人存钱了),阻塞就会自动被唤醒

   synchronized (object){
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }

wait使先解锁然后再阻塞等待,其他的线程就可以获取到object这个锁,防止了死锁的产生。

import java.util.Scanner;

public class Test4 {

    public static void main(String[] args) {
         Object o=new Object();
        Thread thread=new Thread(()->{

            synchronized (o){
                try {
                    o.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        Thread thread1=new Thread(()->{
            Scanner scanner=new Scanner(System.in);
            synchronized (o) {
            scanner.nextInt();
                o.notify();

            }
        });
        thread.start();
  thread1.start();
    }

}

先解除再堵塞等待,可以通过notiify来唤醒。

唤醒后不会立刻执行从WAITING-----RUNNABLE---BLOCKED

但是没有规定执行顺序的时候很有可能会导致,thread1先执行,最后导致notify产生不了效果

 o.notifyAll();//唤醒全部等待的线程

多线程代码

1.单例模式

单例模式是一个经典的设计模式。

单例模式--》单个实例,instance就是对象。

整个过程中的某个类,有且只有一个对象(不会再new出来新的对象)

饿汉模式

只要运行就会立刻instance,无论后面用不用都会调用

public class Singleton {
    private  static Singleton instance=new Singleton();//只要启动就会立刻生成给instance这个对象
    public  static Singleton getInstance(){//就可以通过getlnstance来获取已经new好的这个而不是重新new
        return  instance;
    }
    //要禁止外部代码来创建该类的实例~~
    private  Singleton(){
//类之外的代码,尝试new的时候,,势必就要调用构造方法由于构造方法私有的.无法调用,就会编译出错!!
    }
}

懒汉模式

计算机中,谈到懒,往往是一个"褒义词",而且是“高效率”的代表

懒汉模式,不是在程序启动的时候创建实例,而是在第一次使用的时候才去创建(如果不使用了,就会把创建实例的代价就节省下来了)

public class SingletonLazy {

        private  static SingletonLazy instance=null;
        public  static SingletonLazy getInstance(){
           if (instance==null){
                 instance=new SingletonLazy();
           }
return instance;
        }
       
        private  SingletonLazy(){
        //重中之重
        }


}

在只考虑一个方法getInsttance方法的情况下考虑:

饿汉模式是否安全?安全=>1

创建实例的时机是在java进程启动(比main调用还早的时机)

懒汉模式是否安全?不安全

 t2切换回来之后还是要进行新的new对象操作,就会产生多个对象了。

Instance中的地址指向的那个对象,,可就是一个大的对象了。

产生的对象会被覆盖但是产生以及浪费的时间可是真金白银。

添加

synchronized锁操作。
public class SingletonLazy {
    public static Object object = new Object();

    public static void main(String[] args) {

    }


    private static SingletonLazy instance = null;//只要启动就会立刻生成给instance这个对象

    public static SingletonLazy getInstance() {//就可以通过getlnstance来获取已经new好的这个而不是重新new
        if (instance == null) {

            synchronized (object) {
                instance = new SingletonLazy();
            }
            return instance;
        }
        //要禁止外部代码来创建该类的实例~~
        private SingletonLazy() {
//类之外的代码,尝试new的时候,,势必就要调用构造方法由于构造方法私有的.无法调用,就会编译出错!!
        }


    }
}

 

 public static SingletonLazy getInstance() {//就可以通过getlnstance来获取已经new好的这个而不是重新new
        synchronized (object) {
        if (instance == null) {

         
                instance = new SingletonLazy();
            }
            return instance;
        }

针对后续调用,明明没有线程安全问题,还要加锁,就是画蛇添足加锁本身,也是有开销的=>可能会使线程阻塞)

所以要进行优化操作。

        

StringBuilder 不带锁

StringBuffer 带锁


    public static SingletonLazy getInstance() {
        if (instance==null) {//判定是否要加锁实例化之后,线程自然安全了,就无需加锁了实例化之前,new之前,就应该要加锁
            synchronized (object) {//在这俩if之间,synchronized会使该线程阻塞,阻塞过程中其他线程就可能会修改Instance的值
                if (instance == null) {//判定是否要创建对象
                    instance = new SingletonLazy();
                }
                return instance;
            }
           
        private SingletonLazy() {

            }
        }

    }

此外还要加上volatile这样防止他进行优化操作。 

t1线程修改了Instance引l用,t2有可能读不到.(概率应该是比较小).加上volatile主要是为了万无一失.

指令重排序

加了volatile也能够解决指令重排序引l起的线程安全问题

调整顺序最主要的目的就是提高效率.(前提是保证逻辑是等价的)

重排序的前提,一定是重新排序之后,逻辑和之前等价单线程下,编译器进行指令重排序的操作,一般都是没问题的.编译器可以准确的识别出,哪些操作可以重排序,而不会影响到逻辑~~

instance=new SingletonLazy

这一行代码,其实还可以简要细分成三个步骤~

例子

1.买了个房子)2.装修3.拿到钥匙

123(精装房,开发商直接给你装修好,你收房的时候,已经装修完了

132(毛坏房,自己装修)

1.申请内存空间

2.调用构造方法.(对内存空间进行初始化)

3.把此时内存空间的地址,赋值给Instance引用

在指令重排序优化策略下,上述执行的过程不一定是123也可能是132(1一定是先执行的)

如果这样执行1.申请内存3把地址赋值给引用

一旦执行完意味着Instance就非null !!但是指向的对象其实是一个未初始化的对象(里面的成员都是0)这样就会返回没有初始化的对象。

如果在执行其他方法的时候就会出现没有初始化的对象在操作会产生非常严重的问题/

2.调用方法

所以要引用volatile

按照加上volatile之后,此时,t2线程读到的数据,一定是t1已经构造完毕的完整对象了.(一定是123都执行完毕的对象)

public class SingletonLazy {
    private static volatile SingletonLazy instance = null;//3

    public static Object object = new Object();


    public static SingletonLazy getInstance() {
        if (instance == null) {//2
            synchronized (object) {//1
                if (instance == null) {
                    instance = new SingletonLazy();
                }

            }
  
        }
        return instance;
    }
    private SingletonLazy() {

    }
}

2.阻塞队列

0.普通队列线程不安全的

1.优先级队列.

2.阻塞队列先进先出,线程安全,并且带有阻塞功能-------》1.队列为空,尝试出队列,出队列操作就会阻塞一直阻塞到队列不空为止2.队列为满,尝试入队列,入队列操作也会阻塞一直阻塞到队列不满为止.

3.消息队列不是普通的先进先出,而是通过topic(一块)这样的参数来对数据进行归类出队列的时候,指定topic,每个topic下的数据是先进先出的.

生产者消费者模型

在开发中主要又有两方面的意义

1.能够让程序进行解耦

举个包饺子的例子:

中间的盖帘,相当于一个阻塞队列/消息队列

如果师娘擀的慢,我俩包的快,此时,盖帘上就空着了我和小汤就会阻塞等待如果我俩包的慢,师娘擀的快~~很快盖帘放满了师娘就要阻塞等待。

如果让A直接调用B意味着A的代码中就要包含很多和B相关的逻辑B的代码中也会包含和A相关的逻辑彼此之间就有了一定的耦合。

一旦对A做出修改,可能就会影响到B反之亦然一旦A出bug,也容易把B牵连到反之也是亦然。

 站在A的视角,不知道B的存在,只关心和队列的交互站在B的视角,不知道A的存在,只关心和队列的交互此时,对A的修改,就不太容易影响到BA如果挂了,也不会影响到B。

2.能够使程序"削峰填谷"

客户端发来的请求,个数多少,没法提前预知.遇到某些突发事件,就可能会导致客户端给服务器的请求激增~~

如果是这样的话,b要进行许多重量级操作,一旦A收到的请求增加了,B的请求也会增加,A做的工作简单,B做的复杂,这样B就容易崩溃。

 增加了mq后无论A给队列写多快,B都可以按照固有的节奏来消费数据B的节奏,就不一定完全跟着A了.相当于队列把B保护起来了。

阻塞队列,

BlockingQueue<E>

 阻塞队列只需要考虑,入队列和出队列即可.阻塞队列没有“取队首元素”操作.(也不是完全没有,只不过是没有阻塞功能)

其中的offer和put没有阻塞功能,但是put和take有

Log4cpp多线程崩溃 log4cpp使用多线程运行几分钟后出现崩溃,网上查找资料,找到解决办法,记录下 void OstreamAppender::_append(const LoggingEvent& event) { (*_stream) << _getLayout().format(event); if (!_stream->good()) { ... 阅读详情

相关推荐

Geant4 学习笔记(一):实现multi-thread多线程

简单修改实现Geant4多线程

weixin_52417815的博客 6084

UE4多线程

UE4中最基础的模型就是FRunnable和FRunnableThread,FRunnable抽象出一个可以执行在线程上的对象,而FRunnableThread是平台无关的线程对象的抽象。后面的篇幅会详细讨论这些基础设施。 1. FRunnable UE4为我们抽象FRunnable的概念,让我们指定在线程上运行的一段逻辑过程。该过程通常是一个较为耗时的操作,例如文件IO;或者是常态为空闲等待...

学习是为了探索这个世界的本质 1381

Qt开发者必看:QTimer::singleShot的5个实战避坑指南(含lambda和多线程案例)

本文为Qt开发者提供了QTimer::singleShot的5个关键实战避坑指南,涵盖lambda捕获、对象生命周期和多线程安全等核心难点。通过对比错误与正确代码示例,深入解析了如何避免悬空指针、确保线程执行上下文正确以及管理定时任务资源,帮助开发者编写更健壮、可靠的延迟执行代码。

stem5的博客 466

UE4 多线程 创建与使用

UE4 多线程使用分为以下几种: 1.创建标准线程 2.使用线程池 3.使用TaskGraph系统 使用线程时需要注意,不要在非GameThread线程内执行下面几个操作: 不要 创建/ 修改/ 删除 任何 派生自UObject的对象。 不要使用定时器 TimerManager 不要使用任何绘制接口,例如 DrawDebugLine 1...

pzh的博客 7931

告别手动标注!PDMS NakiToolkit插件安装与初体验:以Pipeline工具为例

本文详细介绍了PDMS NakiToolkit插件的安装与使用,特别是其Pipeline工具如何通过自动化标注和材料统计功能大幅提升三维工厂设计效率。从环境准备到实战演示,帮助工程师告别繁琐的手动标注工作,实现项目交付周期的大幅缩短。

weixin_30047059的博客 350

从‘裸纤’到成品:手把手拆解光纤阵列(FA)的装配、点胶与端面研磨全流程

本文详细拆解了光纤阵列(FA)从裸纤到成品的全流程,包括装配、点胶与端面研磨等关键工艺。通过实战经验和数据对比,揭示了5G基站、数据中心等场景中FA的精密制造要点与常见故障解决方案,为光通信器件生产提供专业指导。

weixin_42652674的博客 745

ue4的多线程如何实现

ue4的多线程如何实现讲道理实例创建c++工程新建一个FunctionLibrary在functionlibrary里编写三个函数,并且在cpp里面加以实现再创建一个空类对该项目在vs 上进行生成创建测试用例结论 讲道理 一般要使用多线程技术的,就是该功能点费时,并且降低效率,阻碍体验。 就ue4来说,多线程一般用于后台的计算,信号的发送,检测等。 比如,通过开启一个线程进行心跳检测,确认码的发送...

tianxiaojie_blog的博客 1万+

华为使用MicroG安装并使用Google服务教程

鉴于众多华为手机用户因无法使用Google服务而感到不便,我经过多次摸索和测试,总结了一份简单易懂的教程,希望能够帮助到大家。无论是需要使用Google Play商店下载应用,还是需要使用Google服务进行工作和学习,本文将详细介绍如何在华为手机上安装并使用Google服务。二、前置条件软件要求:Aurora Store(替代Google Play商店)、MicroG Companion、MicroG Server(替代Google框架)

weixin_41926602的博客 3万+

Selenium 4 + Python 多线程使用

selenium多线程

weixin_45292690的博客 948

特殊通信领域场景应用:基于Simulink的数字预失真(DPD)算法仿真建模示例

增益压缩:高功率输入时输出信号的增益下降。相位失真:输入信号的相位随功率变化而改变。带外干扰:非线性失真会引入额外的频谱分量,影响邻道信号。多项式模型:用多项式拟合功率放大器的非线性特性。查找表(LUT):通过离线训练生成预失真映射表。自适应算法:实时调整预失真参数以动态补偿失真。发送端:生成随机比特流并调制为射频信号。预失真模块:对输入信号进行预失真处理。功率放大器模块:模拟非线性失真。接收端:解调信号并评估误码率(BER)。

xiaoheshang_123的博客 272

linux驱动由浅入深系列:基于高通平台分析触摸屏(TP)、虚拟按键驱动

触摸屏的触摸板(touch panel简称TP)驱动的基本架构和普通按键驱动基本一致,可以参考文章:linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动)。只是其功能稍稍复杂些,配置也多些,下面一起来看一下。 TP包括 触摸屏、虚拟按键、虚拟按键背光灯 TP驱动芯片厂商主要有:Goodix(汇顶),FocalTech(敦泰科技),cypress(赛普拉斯),synapt

Radia的专栏 4767

JUnit4 多线程执行测试用例

前言: 之前发过类似的文章,现重新调整了部分格式,部分内容稍作调整和添加,便于阅读。 评论中,有人说直接使用TestNG,就可以实现多线程,是的,但是方式不一样;我们是按照自己的需求对JUnit4自定义多线程Runner,直接在某个类加上相应的注解即可,运行该类就行,支持类和方法级别;TestNG只在方法上有注解 @Test(threadPoolSize = m, invocationCo

qq_30044187的博客 2609

AMBA-CHI协议详解(三)

Write Transactions、Atomic transactions、 Stash transactions、 Dataless transactions的等各个事务的事务流。

Crazzy_M的博客 3179

UE4 多线程理解

目前对于UE4来说,要实现多线程有多种方式,主要分为一下几种: FRunnable&amp;&amp;FRunnableThread TaskGraph系统 AsyncTask系统 一、FRunnable&amp;&amp;FRunnableThread UE4遵循C++11,因此,我们可以使用std::thread实现多线程。然而,UE4为了能够实现简单跨平台,实现了自己的多线程机制,也即是...

lz_oases的博客 4134

深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码

接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。

微学AI的博客 1582

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

UE4的多线程

1. 源代码   AsyncWork.h 2. 多线程的使用   参考文档:https://wiki.unrealengine.com/Using_AsyncTasks   当我们需要执行一个需要很长时间的任务时,放在主线程里会导致很卡,把此任务放到其他线程里则会好很多,此时多线程就可以起到关键的作用了。   在UE4里,我们可以使用FAsyncTask 或者FAutoDele...

1019

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JUnit4多线程执行测试用例

前言: 在testerhome社区中,有人评论说直接使用TestNG,就可以实现多线程,是的,但是方式不一样;我们是按照自己的需求对JUnit4自定义多线程Runner,直接在某个类加上相应的注解即可,运行该类就行,支持类和方法级别;TestNG只在方法上有注解 @Test(threadPoolSize = m, invocationCount = n, timeOut = i)实现了对这个方法进

neven7的专栏 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

UE4套件-多线程库开发

哈喽大家好,我叫人宅,这一期我们给大家带来一套工具类教程,如何开发UE4多线程商业库。 本套教程将融合了UE4代理,UE4多线程,UE4智能指针,插件开发等综合知识进阶的技巧,是一套综 合实战课程。, 虽然UE4为我们游戏开发提供了三套多线程解决方案,但是在我们日常开发项目中,依然需要封装和整合UE4线程,比如做服务器开发 or 是引擎开发。如果对多线程使用上只是熟悉或者不太了解的,...

人宅 835

UE4的多线程和tick

文章目录简介常用方法TickTimerManagerAsyncTaskAsyncFAutoDeleteAsyncTaskFAsyncTaskFRunnable一些新发现FTickableGameObject线程的同步FCriticalSection 简介 多线程在任何语言中都是不可或缺的,意义重大的,因此,能熟练使用多线程往往是一件能让工作事半功倍的事情。那么做为强大的UE4引擎,又给了我们什么支持呢?很多人可能知道runable,知道tick但是这都只是UE4多线程的一部分,我开始也就知道这些,然后用起来

u012505629的博客 1623

《Exploring in UE4》多线程机制详解[原理分析]

目录一.概述二."标准"多线程三.AsyncTask系统3.1 FQueuedThreadPool线程池3.2 Asyntask与IQueuedWork3.3 其他相关技术细节四.TaskGraph系统4.1 从Tick函数谈起4.2 TaskGraph系统中的任务与线程4.3 TaskGraph系统中的任务与事件4.4 其他相关技术细节五.总结一.概述多线程是优化项目性能的重要方式之一,游戏也不例外。虽然经常能看到“游戏不适合利用多线程优化”的言论,但我个人觉得这句话更多的是针对GamePlay,游戏中多

wubaohu1314的博客 944

Geant4 多线程问题(尝试解决)

面对需要模拟非常多粒子时,如果只使用单线程进行模拟,就会非常非常缓慢,会出现“一核有难,九核围观”的场景,且只是用单线程也无法享受到使用服务器的大规模并行加速。所以解决问题的关键是启用多线程。Geant4使用多线程最简单的方法是手动多线程,即开多个终端,独立运行多个Geant4程序来手动实现并行。但这样做无疑是不优雅的,并且Geant4内置有多线程的功能,那怎么才能用好这一功能呢?

magefreehome的博客 2389

Unreal Engine 4 —— 多线程任务构建

这篇博客介绍了UE4中多线程任务的C++构建。

谁允许你直视本大叔的? 1万+

Java HttpClient4 get方式多线程下载文件

1. HttpClient 4 多线程下载文件 利用httpclient4

lichao_ustc的专栏 3434
上一篇: 多线程3
下一篇: 多线程5
鱼裤
博客等级 码龄4年 678粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼裤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值