多线程学习(二)

多线程概念 

  并发性和并行性  

在单个处理器的多线程进程中,处理器可以在线程之间切换执行资源,从而执行并 发。

在共享内存的多处理器环境内的同一个多线程进程中,进程中的每个线程都可以在一 个

单独的处理器上并发运行,从而执行并行。如果进程中的线程数不超过处理器的数 目,

则线程的支持系统和操作环境可确保每个线程在不同的处理器上执行。例如,在 线程数

和处理器数目相同的矩阵乘法中,每个线程和每个处理器都会计算一行结果。

  多线程结构一览

传统的UNIX已支持多线程的概念。每个进程都包含一个线程,因此对多个进程进行 编程即

是对多个线程进行编程。但是,进程同时也是一个地址空间,因此创建进程会 涉及到创建新

的地址空间。创建线程比创建新进程成本低,因为新创建的线程使用的是当前进程的地址空间。

相 对于在进程之间切换,在线程之间进行切换所需的时间更少,因为后者不包括地址空 间之

间的切换。在进程内部的线程间通信很简单,因为这些线程会共享所有内容,特别是地址空间。

所以,一个线程生成的数据可以立即用于其他所有线程。 在Solaris9和较早的Solaris发行版中,

支持多线程的接口是通过特定的子例程库实现 的。这些子例程库包括用于POSIX线程的libpthread

和用于Solaris线程的 libthread。多线程通过将内核级资源和用户级资源分离来提供灵活性。在

当前的发行 版中,对于这两组接口的多线程支持是由标准C库提供的。

  用户级线程

线程是多线程编程中的主编程接口。线程仅在进程内部是可见的,进程内部的线程会 共享诸如地址空间、打开的文件等所有进程资源。

  用户级线程状态

以下状态对于每个线程是唯一的。

■ 线程ID

■ 寄存器状态(包括PC和栈指针)

■ 栈

■ 信号掩码

■ 优先级

■ 线程专用存储
由于线程可共享进程指令和大多数进程数据,因此一个线程对共享数据进行的更改对 进程内其他线程是可见的。

一个线程需要与同一个进程内的其他线程交互时,该线程 可以在不涉及操作系统的情况下进行此操作

  线程调度

POSIX标准指定了三种调度策略:先入先出策略(SCHED_FIFO)、循环策略(SCHED_RR)和 自定义策略(SCHED_OTHER)。

SCHED_FIFO是基于队列的调度程序,对于每个优先级都会 使用不同的队列。

SCHED_RR与FIFO相似,不同的是前者的每个线程都有一个执行时间 配额。

SCHED_FIFO和SCHED_RR是对POSIX Realtime的扩展。SCHED_OTHER是缺省的调度策略。

  线程取消 

一个线程可以请求终止同一个进程中的其他任何线程。目标线程(要取消的线程)可 以延后取消请求,

并在该线程处理取消请求时执行特定于应用程序的清理操作。

通过pthread取消功能,可以对线程进行异步终止或延迟终止。异步取消可以随时发 生,而延迟取消

只能发生在所定义的点。延迟取消是缺省类型。

  线程同步

使用同步功能,可以控制程序流并访问共享数据,从而并发执行多个线程。

共有四种同步模型:互斥锁、读写锁、条件变量和信号。

■ 互斥锁仅允许每次使用一个线程来执行特定的部分代码或者访问特定数据。

■ 读写锁允许对受保护的共享资源进行并发读取和独占写入。要修改资源,线程必须 首先获取互斥写锁。只有释放所有的读锁之后,才允许使用互斥写锁。

■ 条件变量会一直阻塞线程,直到特定的条件为真。

■ 计数信号量通常用来协调对资源的访问。使用计数,可以限制访问某个信号的线程 数量。达到指定的计数时,信号将阻塞。

时间: 2024-10-23 20:25:16

多线程学习(二)的相关文章

C#多线程学习(一) 多线程的相关概念

什么是进程?    当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?    线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数. 什么是多线程?    多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务. 多线程的好处:    可以提

C#多线程学习(一) 多线程的相关概念(转)

什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数. 什么是多线程?多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务. 多线程的好处:可以提高CPU的利用率.在多线程程序中

多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现

一.多线程模型一:生产者消费者模型   (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个"仓库"的概念,生产者消费者都是围绕着:"仓库"来进行操作,一个仓库同时只能被一个生产者线程或一个消费者线程所操作,synchronized锁住的也是这个仓库,仓库是一个容器,所以会有边界值,0和仓库可存放上限,在这个上限内,可以设置多种级别,不同的级别可以执行不同的策略流程. (3)本案例使用知识点: Thread.curre

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Java多线程学习(详细)

一.进程与线程的区别 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止.     多进程是指操作系统能同时运行多个任务(程序).     多线程是指在同一程序中有多个顺序流在执行. 在java中要想实现多线程,有两种手段,一

多线程学习 + o2o简识

多线程学习: ( 1.NSThread 2.NSOperationQueue 3.GCD ) 1.进程和线程: 进程:app无法独立运行,需要分配内存空间,每个app至少有一个进程,是应用程序的开始(缺点:不能同时执行) 线程:是应用程序运行的最小单元可以多个线程并发同时执行,防止主线程堵塞,增加运行效率. 主线程:又叫UI主线程,程序运行都是在主线程加载,加载视图,但不可加载数据,因为请求网络数据的时间特别长,会出现空白现象(更新UI一定要在主线程中写) 子线程:没法加载UI,UI只在主线程中

Java多线程学习

写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线

Java多线程学习(吐血超具体总结)

林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文仅仅能说是java多线程的一个入门.事实上Java里头线程全然能够写一本书了,可是假设最基本的你都学掌握好,又怎么能更上一个台阶呢?假设你认为此文非常简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 文件夹(?)[-] 一扩展ja

Java多线程学习(吐血超详细总结)转

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1

Win32 多线程学习笔记

学到的API函数 一.线程 创建线程.结束线程.获取线程的结束码 CreateThread ExitThread GetExitCodeThread 二.线程结束时触发 创建线程之后,等待线程的结束之后,再继续执行 WaitForSingleObject 创建多个线程之后,等待一组线程(或其中的一个)结束,再继续执行 WaitForMultipleObjects 将消息循环与内核对象的等待合并 MsgWaitForMultipleObjects 三.同步 SendMessage 是同步的 Pos