11.2 线程概念

典型的UNIX程序被认为是单线程控制的:每一个进程在一个时刻仅仅做一件事;引入多线程以后,我们可以在单个进程内设计程序同时执行多个任务,该方法有如下几个好处:

  • 我们可以简化异步时间处理的程序的设计:对于每一种时间类型非配一个单独的线程,每一个线程都可以使用同步模型来处理事件,同步编程模型比异步编程模型更加简单。
  • 多进程要实现内存和文件描述符共享需要使用操作系统提供的复杂机制,这一点将在第15章和17章中看到,相反,线程,自动便拥有了同一地址空间内的内存与文件描述符的访问权限。
  • 一些程序可以被分化成为几个单独的任务,从而的提高程序的处理能力。单线程进程处理多任务的时候实际上是串行执行多任务的,因为进程内仅仅只有一个控制线程。采用多线程控制以后,独立任务的处理可以同步执行,方法是为每一个任务分配一个线程,注意,连个任务可以并行执行的条件是二者并不互相依赖。
  • 类似地,交互式程序设计可以使用多线程来改善其相应速度,方法是将程序中处理用户输入与输出的程序划分为一个线程,其他任务使用其他线程实现。

有人会将多线程编程与多处理或者是多核系统联系在一起。而多线程模型的好处即使是在一台单处理器系统上也可是实现,程序设计可以通过多线程而不是多进程来简化设计,因为处理器数量并不影响程序结构。并且,只要程序在串行处理任务时需要阻塞的时候,即使是在一个单处理器机器上,你仍然可以通过多线程来改善程序的相应时间和吞吐量,因为因为一些线程被阻塞的时候,其他线程可以继续运行。

一个线程包含了必要的信息来表示进程执行的上下文环境。其中包含了一个线程ID用于表示进程内的线程,一个寄存器集合,一个堆栈,一个调度优先级以及调度策略,一个信号掩码,以及一个errno变量(1.7节),以及线程独占的数据(thread-specific data,参考12.6节)。进程内的一切都是可以在各线程之间共享,包括可执行程序,程序的全局变量以及堆内存,栈以及文件描述符。

我们即将学习的线程接口源于POSIX.1-2001。The Threads interfaces, also known as “pthreads” for “POSIX threads”,在POSIX.1-2001中是可选的,但是SUSv4将他们移到了基本要求中。对于POSIX threads的特性测试宏是_POSIX_THREADS.应用程序可以在编译时采用#ifdef来进行测试,或者在运行时使用sysconf传参_SC_THREADS常量来测试系统是否支持POSIX线程。符合SUSv4的系统都会定义标识_POSIX_THREADS,其值为200809L

来自为知笔记(Wiz)

时间: 2024-12-09 12:25:50

11.2 线程概念的相关文章

[linux]进程(八)---线程概念

线程 概念:线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),进程的所有信息对该进程的所有线程是共享的,包括程序文本,程序的全部内存,堆,栈和文件描述符. 线程标识:进程ID在整个系统中是唯一的,用pid_t数据类型表示,线程ID只在它所属的进程环境中有效,用pthread_t数据类型表示,用 pthread_t pthread_self(void):来获得自身线程ID. 1 #include <stdio.h> 2 #include <st

《Unix环境高级编程》读书笔记 第11章-线程

1. 引言 了解如何使用多个控制线程在单进程环境中执行多个任务. 不管在什么情况下,只要单个资源需要在多个用户键共享,就必须处理一致性问题. 2. 线程概念 典型的Unix进程可以看成只有一个控制线程:一个进程在某一时刻只能做一件事情. 多线程带来的好处: 通过为每种事件类型分配单独的处理线程,可以简化处理异步事件的代码.每个线程在进行事件处理时可以采用同步编程模式. 多个进程必须使用操作系统提供的复制机制才能实现内存和文件描述符的共享.而多个线程自动地可以访问相同的存储空间和文件描述符. 有些

基于C++11的线程池

1.封装的线程对象 class task : public std::tr1::enable_shared_from_this<task> { public: task():exit_(false){} task( const task & ) = delete; ~task(){} task & operator =( const task &) = delete; void start(); void stop() { exit_ = true; sync_.not

线程概念及线程的同步与互斥

线程概念:它是运行在进程内部的的一个基本执行流,多线程的控制流程可以长期并存,一个进程中的数据段和代码段都是被该进程中的多个线程共享的,若定义一个函数,每个线程都可以调用,若定义一个全局变量,每个线程都可以访问. 线程还共享进程的以下内容:1.文件描述符表 2.当前的工作目录 3.用户id(uid)和组id(gid) 4.每种信号的处理方式. 但每个线程还必须有自己的私有部分:1.线程id 2.硬件上下文(硬件寄存器的值,栈指针等) 3.自己的栈空间(运行时的临时数据都要保存在自己的栈空间上)

JAVA线程概念

一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. "同时"执行是人的感觉,在线程之间实际上轮换执行. 二.Java中的线程 在J

线程概念简介 什么是线程 多线程上篇(七)

操作系统为了程序的并发执行引入了进程的概念,提高了资源的利用率以及吞吐量. 在20世纪 60年代人们提出了进程的概念后,在OS中一直都是以进程作为能拥有资源和独立运行的基本单位的. 直到 20 世纪 80 年代中期,人们又提出了比进程更小的能独立运行的基本单位——线程(Threads) 试图用它来提高系统内程序并发执行的程度,从而可进一步提高系统的吞吐量. 简言之,进程的概念,使之能够并发执行多道程序,线程的概念让你更好地并发执行程序,一个是能不能的问题,一个是更好的问题. 线程与进程对比 线程

线程概念及多线程控制

多线程: 多进程:可以同时处理数据(并发/并行) 多线程:可以同时处理数据(并发/并行) 线程概念: 多进程任务处理(使用的是多个虚拟地址空间):将多个任务分解为多个程序(分解到多个进程中完成). 多线程任务处理:多个pcb 共用同一个虚拟地址空间,同时完成一个代码段中多个不同模块的功能. 进程的理解:只有一个线程的进程 线程的理解: 1.在传统操作系统中进程就是一个运行中程序中的描述信息 ——>pcb,控制程序的运行 2.linux中并没有为线程设计一个tcb 来控制线程的运行 3.在linu

11.6 线程同步

11.6.1 互斥Example11.6.2 避免死锁Example11.6.3 pthread_mutex_timedlock 函数Example11.6.4Reader-Writer LocksExample11.6.5 带有超时功能的读写锁11.6.6 条件变量Example11.6.7 自旋锁11.6.8 BarriersExample 当多个线程控制流需要共享内存的时候,我们需要确保每一个线程所看到的数据是一致的.如果一个线程使用别的线程不会读取或者修改的数据,那么一致性问题并不会出现

11.4 线程创建

传统UNIX程序模型中每一个进程都只支持一个线程控制,在概念上,这与每个线程仅仅由一个线程组成的线程模型是一样的.采用pthreads以后,当一个程序运行的时候,系统也会启动一个单线程控制进程,当程序运行的时候,其行为与传统进程并没有什么明显区别,除非它创建了多线程控制,其他线程可以通过调用函数pthread_create来创建. #include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_at