精华内容
下载资源
问答
  • 多线程之间有两种关系
    千次阅读
    2013-10-29 10:47:23
    多线程在运行的时候,主要有两种关系:互斥和同步。互斥体现
    在多个线程共享受限资源时,同步体现在多个线程之间的协作上。
    更多相关内容
  • 第一 继承Thread类 ...使用继承Thread类来实现多线程时,最大的局限是不能支持多线程,因为Java语言的特点是单根继承。 创建过程首先新建一个类继承Thread类,然后重写run方法,在run方法中,写线程要执行的任...

    第一种 继承Thread类

    Thread类的结构:public class Thread implements Runnable 可以看出Thread类继承了 Runnable接口,他们之间是多态的关系。使用继承Thread类来实现多线程时,最大的局限是不能支持多线程,因为Java语言的特点是单根继承。
    创建过程首先新建一个类继承Thread类,然后重写run方法,在run方法中,写线程要执行的任务代码即可。
    在调用时,只需要创建一个类的对象,然后使用对象调用start方法。

    第二种 实现Runnable接口

    上边已经说了使用继承Thread类来创建多线程的类,不支持多继承,而如果是使用实现Runnable接口的方式创建多线程,那么很好的解决了Thread不能多继承的问题,而且Thread类继承了Runnable接口所以这两种方式创建的线程在工作时性质上是一样的,没什么太大的差别。
    创建过程首先建一个类实现Runnable接口,然后重写run方法。
    调用时和继承Thread类的实现的多线程有点差别。
    需要使用Thread.java的构造函数。Thread.java有8个构造函数,其中有两个可以传递Runnable 接口,Thread( Runnable target)和Thread(Runnable target,String name)。使用如下:

    	// 首先实例化实现了Runnable的类 MyThread
    	MyThread myThread= new MyThread();
    	Thread td = new Thread(myThread);
    	td.start();
    

    因为Thread类本身继承了Runnable接口,所以构造函数Thread( Runnable target)和Thread(Runnable target,String name)也可以传入一个Thread类的对象,这样可以将Thread对象的run()方法交由其他的线程调用。

    展开全文
  • 多线程在实际编程中的重要性不言而喻,对 C++ 而言,当我们需要使用多线程时,多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C++11 开始支持的 std::thread 库,以及其他一些第三方库 ...

    多线程在实际编程中的重要性不言而喻,对 C++ 而言,当我们需要使用多线程时,有多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C++11 开始支持的 std::thread 库,以及其他一些第三方库 libdispatch(GCD)和 OpenMP 等等。

    至于选择哪种多线程编程方案,需要根据你的实际项目、运行平台、团队协作等因素来考虑。一般而言,如果使用的是 Linux 操作系统,那么可以直接使用系统提供的 pthread 库编写多线程 C++ 程序;如果需要跨平台,则推荐使用 C++ 标准的 std::thread 库。

    本文将分别介绍 pthreadstd::thread 库的使用。

    pthread

    基于 POSIX 开发多线程程序需要包含头文件 <pthread.h>

    #include <pthread.h>
    

    pthread 提供了一个 pthread_t 类型用来表示一个线程。由于 pthread 库不是 Linux 系统默认的库,因此编译时需要加上 -lpthread 选项以链接 pthread 库。

    g++ main.cpp -lpthread
    

    pthread 库提供了一系列 API 用于操作线程,常用的一些接口函数原型如下所示。

    // 创建线程
    int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
                       void *(*start_routine)(void *), void *arg);
    
    // 终止线程
    void pthread_exit(void *retval);
    int pthread_cancel(pthread_t thread);
    
    // 线程连接和分离
    int pthread_join(pthread_t thread, void **retval);
    int pthread_detach(pthread_t thread);
    

    关于这些接口的参数和使用说明,可以参考 Linux 多线程 这篇文章。

    下面通过一个示例来演示在 C++ 中如何使用 pthread 接口实现多线程。

    #include <iostream>
    #include <pthread.h>
    
    using namespace std;
    
    // 定义线程数量
    #define NUM_THREADS 10
    
    // 线程函数实体
    void *thread_entry(void* args)
    {
        // 对传入的参数进行强制类型转换
        // 由无类型指针变为整形数指针,然后再读取
        int tid = *(int *)args;
    
        cout << tid << ": Hello thread!" << endl;
    
        pthread_exit(NULL);
    }
    
    int main(void)
    {
        pthread_t tids[NUM_THREADS];
        int index[NUM_THREADS];
    
        // 创建线程
        for (int i=0; i<NUM_THREADS; i++)
        {
            index[i] = i;
            pthread_create(&tids[i], NULL, thread_entry, (void *)&index[i]);
        }
    
        // 等待线程完成
        for (int i=0; i<NUM_THREADS; i++)
        {
            pthread_join(tids[i], NULL);
        }
    
        pthread_exit(NULL);
    
        return 0;
    }
    

    执行下面命令编译程序,注意需要添加 -pthread 选项以链接 pthread 库。

    g++ main.cpp -pthread
    

    运行结果:

    0: Hello thread!
    5: Hello thread!
    1: Hello thread!
    9: Hello thread!
    8: Hello thread!
    2: Hello thread!
    7: Hello thread!
    4: Hello thread!
    6: Hello thread!
    3: Hello thread!
    

    你看到的顺序和这里的结果可能不一样,不过没关系,这正是多线程运行的效果。

    std::thread

    C++11 中加入了 <thread> 头文件,此头文件主要声明了 std::thread 线程类。std::thread 类对线程进行了封装,定义了一些表示线程的类、用于互斥访问的类与方法等。

    查看 C++ Reference 手册,std::thread 类有以下成员:

    其中,成员属性说明如下:

    • std::thread::id 表示线程 ID,定义了在运行时操作系统内唯一能够标识该线程的标识符,同时其值还能指示所标识的线程的状态。
    • native_handle_type 是连接 thread 类和操作系统 SDK API 之间的桥梁,如在 Linux g++(libstdc++)里,native_handle_type 其实就是 pthread 里面的 pthread_t 类型。

    成员函数的说明如下:

    • get_id:获取线程 ID,返回一个类型为 std::thread::id 的对象。
    • joinable:检查线程是否可被 join。检查 thread 对象是否标识一个活动(active)的可行性线程。缺省构造的 thread 对象、已经完成 join 的 thread 对象、已经 detach 的 thread 对象都不是 joinable 的。
    • join:调用该函数会阻塞当前线程。阻塞调用者(caller)所在的线程直至被 join 的 std::thread 对象标识的线程执行结束。
    • detach:将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以单独进行。一旦线程执行完毕,它所分配的资源将会被释放。
    • swap:交换两个线程对象所代表的底层句柄。
    • native_handle:该函数返回与 std::thread 具体实现相关的线程句柄。当 thread 类的功能不能满足我们的要求的时候(比如改变某个线程的优先级),可以通过 thread 类实例的 native_handle() 返回值作为参数来调用相关的 pthread 函数达到目的。
    • hardware_concurrency:静态成员函数,返回当前计算机最大的硬件并发线程数目。基本上可以视为处理器的核心数目。

    示例:使用 std::thread 创建多个线程并传递参数

    #include <iostream>
    #include <thread>
    
    using namespace std;
    
    static const int nt=10;
    
    void Hello(int num)
    {
        cout << num << ": Hello thread!" << endl;
    }
    
    int main(void)
    {
        thread t[nt];
        
        // 创建线程
        for (int i=0; i<nt; i++) {
            t[i] = thread(Hello, i);
        }
        
        // 等待线程完成
        for (int i=0; i<nt; i++) {
            t[i].join();
        }
        
        return 0;
    }
    

    可以看到,使用 std::thread 创建线程、传递参数,比使用 pthread 库接口方便多了!

    执行 g++ main.cpp -pthread && ./a.out 编译运行以上程序,输出结果如下:

    0: Hello thread!
    4: Hello thread!
    3: Hello thread!
    5: Hello thread!
    6: Hello thread!
    7: Hello thread!
    8: Hello thread!
    9: Hello thread!
    2: Hello thread!
    1: Hello thread!
    

    上述例子使用 join() 等待子线程结束,其实我们也可以使用 detach() 不等待子线程。

    join() 表示主线程需要等待子线程结束方可执行下一步(串行),而 detach() 则表示让子线程放飞自我,独立于主线程并发执行,主线程后续代码段无需等待。

    示例:使用 detach 实现多线程并发

    #include <iostream>
    #include <thread>
    
    using namespace std;
    
    static const int nt=10;
    
    void Hello(int num)
    {
        cout << num << ": Hello thread!" << endl;
    }
    
    int main(void)
    {
        thread t[nt];
        
        for (int i=0; i<nt; i++) {
            t[i] = thread(Hello, i);
            t[i].detach();
        }
    
        cout << "Main thread exit." << endl;
        
        return 0;
    }
    

    执行 g++ main.cpp -pthread && ./a.out 编译运行以上程序,输出结果如下:

    0: Hello thread!
    1: Hello thread!
    3: Hello thread!
    2: Hello thread!
    4: Hello thread!
    6: Hello thread!
    8: Hello thread!
    Main thread exit.
    9: Hello thread!
    

    可以看到,主线程比子线程先退出了。


    点击 GetIoT.tech 学习更多 C++ 编程知识!

    展开全文
  • cpu与多线程之间关系

    千次阅读 2018-07-02 14:12:00
    Linux查看CPU的使用情况:命令 topWindows查看CPU的使用情况:命令 ctrl+shift+esc ,点击查看性能CPU 与多线程之间关系 CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级。CPU从早期的单核,发展到现在...

    Linux查看CPU的使用情况:命令 top

    Windows查看CPU的使用情况:命令 ctrl+shift+esc ,点击查看性能

    CPU 与多线程之间的关系

          CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级。CPU从早期的单核,发展到现在的双核,多核。CPU除了核心数之外,还有线程数之说,下面笔者就来解释一下CPU的核心数与线程数的关系和区别。 

      简单地说,CPU的核心数是指物理上,也就是硬件上存在着几个核心。比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组,等等,依次类推。 
      线程数是一种逻辑的概念,简单地说,就是模拟出的CPU核心数。比如,可以通过一个CPU核心数模拟出2线程的CPU,也就是说,这个单核心的CPU被模拟成了一个类似双核心CPU的功能。我们从任务管理器的性能标签页中看到的是两个CPU。 
      比如Intel 赛扬G460是单核心,双线程的CPU,Intel 酷睿i3 3220是双核心 四线程,Intel 酷睿i7 4770K是四核心 八线程 ,Intel 酷睿i5 4570是四核心 四线程等等。 
      对于一个CPU,线程数总是大于或等于核心数的。一个核心最少对应一个线程,但通过超线程技术,一个核心可以对应两个线程,也就是说它可以同时运行两个线程。 
      CPU的线程数概念仅仅只针对Intel的CPU才有用,因为它是通过Intel超线程技术来实现的,最早应用在Pentium4上。如果没有超线程技术,一个CPU核心对应一个线程。所以,对于AMD的CPU来说,只有核心数的概念,没有线程数的概念。 
      CPU之所以要增加线程数,是源于多任务处理的需要。线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间CPU能同时并行处理的任务数。 
      在Windows中,在cmd命令中输入“wmic”,然后在出现的新窗口中输入“cpu get *”即可查看物理CPU数、CPU核心数、线程数。其中, 
      
    展开全文
  • Java 实现多线程的四方式

    万次阅读 2020-09-19 22:06:34
    在 Java 中实现多线程一共方式: 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口 线程池 下面我将对这四方式进行入门级的解析和演示。 一、继承 Thread 类 通过继承 Thread 类实现多线程的步骤...
  • 【原文地址 ... ...  Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独...要产生一个线程,有两种
  • 什么叫进程?什么叫线程? 进程相当于一个应用程序,线程就是进程中的一个应用场景或者说是一个执行单元,一个进程可以...(注意:进程和进程之间内存独立不共享,但线程与线程之间存在资源共享,在java中,线程和线..
  • 日常开发中如果用到多线程编程,也一定会涉及到线程安全问题 线程安全这个问题就不太好理解 正因为如此,程序猿们才尝试发明出更多的编程模型来处理并发编程的任务 例如:多进程、多线程、actor、csp、async+await、...
  • 万字图解Java多线程

    万次阅读 多人点赞 2020-09-06 14:45:07
    java多线程我个人觉得是javaSe中最难的一部分,我以前也是感觉学会了,但是真正有多线程的需求却不知道怎么下手,实际上还是对多线程这块知识了解不深刻,不知道多线程api的应用场景,不知道多线程的运行流程等等,...
  • 并发操作之——JAVA线程常见几状态及解释并发操作前言一、JAVA线程有常见状态,分别是什么意思?创建(NEW):就绪(Runnable):运行(Running)阻塞(Blocked)等待阻塞:同步阻塞:等待(WAITING):超时等待(TIMED_...
  • 多线程带来的问题 为什么需要多线程 其实说白了,时代变了,现在的机器都是多核的了,为了榨干机器最后的性能我们引入单线程。 为了充分利用CPU资源,为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不...
  • 一 cpu个数、核数、线程数的关系 cpu个数:是指物理上,也及硬件上的核心数; 核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;...二 cpu线程数和Java多线程 首先明白几个概念: (1) 单个cpu线程在同...
  • Android多线程实现方式包括: 二、基础使用 Android多线程实现的基础使用包括: 继承Thread类 实现Runnable接口 Handler 接下来对各个进行分析。 1、继承Thread类 1.1 简介 1.2 使用详解 (1)使用步骤 (2) ...
  • Go学习笔记—多线程

    千次阅读 2021-12-01 10:27:19
    多线程编程 ​ 一个进程可以包含多个线程,这些线程运行的一定是同一个程序(进程==程序),且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位,线程是调度运行的基本单位,线程...
  • Java多线程学习(吐血超详细总结)

    万次阅读 多人点赞 2015-03-14 13:13:17
    本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。
  • java创建线程两种方式及区别

    千次阅读 2018-07-24 18:35:47
    本文将介绍创建线程两种方式,示例代码在下面,复制粘贴即可 继承Thread类方式和实现Runnable接口方式 区别:由于在开发的过程中,很的类都会用到继承的方式,如果采用继承的方式会让各个类之间关系变得错综...
  • 纯面试 纯文字 看起来乱但适合面试总结 多线程 什么是线程和进程?他们是什么关系? 进程:在操作系统中能够独立运行,并且作为资源分配的基本单位。...多线程有什么用? 发挥多核CPU的优势 防止.
  • 多线程和CPU的关系

    万次阅读 2019-06-20 11:20:19
    制,允许线程之间共享资源,防止线程之间产生冲突。 CPU和线程的关系 (1) 第一阶段,单CPU时代,单CPU在同一时间点,只能执行单一线程。比如,的某一刻00:00:00 这一秒,只计算1+1=2(假设cpu每秒计算一次...
  • 管道( pipe ):管道是一半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系2.有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无...
  • Java多线程面试题(面试必备)

    万次阅读 多人点赞 2020-05-26 01:15:38
    并发编程1.1 并发编程的优缺点1.2 并发编程的三要素1.3 并发和并行和区别1.4 什么是多线程多线程的优劣?2. 线程与进程2.1 什么是线程与进程2.2 线程与进程的区别2.3 用户线程与守护线程2.4 什么是线程死锁2.5 ...
  •  进程,Windows 应用程序中消息有两种送出途径;直接和排队。Windows或某些运行的应用程序可直接发布消息给窗口过程,或者,消息可送到消息列象连续不断轮询消息队列的OS中当前执行的每个进程都 ...
  • 多线程面试题(值得收藏)

    万次阅读 多人点赞 2019-08-16 09:41:18
    金九银十快到了,即将进入找工作的高峰期,最新整理的最全多线程并发面试47题和答案总结,希望对想进BAT的同学帮助,由于篇幅较长,建议收藏后细看~ 1、并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,...
  • 【Java多线程】Java多线程技能

    万次阅读 2021-10-02 20:18:56
    1. 进程和多线程的概念及线程的优点 提到多线程这个技术就不得不提及“进程”这个概念,在“百度百科”中对进程的解释如下: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源...
  • 多线程常见的面试题

    万次阅读 2020-09-16 16:21:58
    多线程常见的面试题: 1. 什么是线程和进程? 线程与进程的关系,区别及优缺点? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 ...
  • QT多线程编程详解

    万次阅读 多人点赞 2019-04-24 22:08:20
    一、线程基础 1、GUI线程与工作线程 每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次...二、QT多线程简介 QT通过三形式提供了对线程...
  • 处理多线程就是异步,单线程就是同步 同步是阻塞模式,异步是非阻塞模式 从一定意义上讲,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行 ...
  • 进程、线程和CPU 之间关系(一)

    千次阅读 2020-10-31 15:43:15
    今天开始,这个专题主要讲解 java 并发编程系列,从操作系统的进程、CPU、线程等底层开始,到java 并发工具类,线程、线程池,并发容器、CAS、AQS等原理、源码和使用均...今天讲进程、线程和CPU 之间关系 。 1、 ...
  • 管道( pipe ):管道是一半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许...
  • 计算机是如何工作的,Java多线程编程

    万次阅读 多人点赞 2022-03-21 19:06:51
    网络操作 (socket) 总结: 四、多线程 1、线程(Thread) 为啥要进程?因为我们的系统支持多任务了,程序猿也就需要 “并发编程” 通过多进程,是完全可以实现并发编程的,但是有点小问题: 如果需要频繁的创建而 ...
  • 多线程带来的风险——线程安全

    千次阅读 多人点赞 2022-05-30 10:14:30
    多线程带来的风险——线程安全 文章目录多线程带来的风险——线程安全一、何为线程安全1.1 线程不安全的原因二、多线程带来的风险——线程安全2.1、 原子性2.1.1如何让线程安全?2.1.2、 synchronized (这里简单...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 365,369
精华内容 146,147
关键字:

多线程之间有两种关系