并发编程学习记录

重要知识点

现代系统基本的构造并发程序的方法

  1. 进程:用这个方法,每个逻辑流都是一个进程,由内核来调度和维护。因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信机制
  2. I/O多路复用:在这种形式的并发编程中,应用程序在一个进程的上下文中显示地调度它们自己的逻辑流。逻辑流被模型化为状态机,数据到达文件描述符后,主程序显示地从一个状态转化到另一个状态。因为程序是一个单独的进程,所以所用流共享同一个地址空间。
  3. 线程:线程是运行在一个单一进程上下文中的逻辑流,由内核进行调度。由内核进行调度,共享同一个虚拟地址空间。

基于进程的并发编程的优缺点

  • 优点:进程不可能不小心覆盖另一个进程的虚拟存储器。
  • 缺点:独立的地址空间使得进程共享状态信息变得更加困难。为了共享信息,它们必须使用显示的IPC(进程间通信)机制,而进程控制和IPC的开销很高,因此会比较慢。

基于I/O多路复用技术的并发编程的优缺点

  • 优点:

    • 它比基于进程的设计给了程序员更多的对程序行为的控制。
    • 每个逻辑流都能访问该进程的全部地址空间,这使得流之间共享数据变得容易。
  • 缺点:编码复杂。

线程与线程池

线程不是按照严格的父子层次来组织的。和一个线程相关的线程组成一个对等(线程)池独立于其他线程创建的线程。

主线程和其他线程的区别仅在于它总是进程中第一个运行的线程。在对等线程池中,一个线程可以杀死它的任何对等线程,或者等待它的任意对等线程终止。另外,每个对等线程都能读写相同的共享数据。

Posix线程

    Posix线程是在C程序中处理线程的一个标准接口。

  • 创建线程

    线程通过调用pthread_create函数来创建其他进程。

    Pthread_create函数创建一个新进程,带着一个输入变量arg,在线程的上下文中运行线程例程f。能用attr参数来改变新创建线程的默认属性。当pthread_create返回时,参数tid包含新创建线程的ID。新线程可以通过调用pthread_self函数来获得它自己的线程ID。

  • 终止线程

    一个线程可以通过以下方式终止:

    • 当顶层的线程例程返回时,线程会隐式地终止。
    • 通过调用pthread_exit函数,线程会显示地终止。如果主线程调用pthread_exit,它会等待所有其他对等线程终止,然后再终止主线程和整个进程,返回值为thread_return。

    • 某个对等线程调用Unix的exit函数,该函数终止进程以及所有与该进程有关的线程。
    • 另一个对等进程通过以当前线程ID作为参数调用pthread_cancle函数来终止当前线程。

  • 回收已终止线程的资源

    线程通过调用pthread_join函数等待其他线程终止

    pthread_join函数会阻塞,直到线程tid终止,将线程例程返回的(void*)指针赋值为thread_return指向的位置,然后回收已终止线程占用的所有存储器资源。

  • 分离线程

    线程是可结合或可分离的。

    • 一个可结合的线程能够被其他线程回收其资源和杀死,在被其他线程回收之前,它的存储器资源是没有被释放的。
    • 一个分离的线程是不能被其他线程回收或杀死的。它的存储器资源在它终止时由系统自动释放。

线程存储器模型

    一组并发线程运行在一个进程的上下文中。每个线程都有它自己独立的线程上下文,包括线程ID、栈、栈指针、程序计数器、条件码和通用目的寄存器值。每个线程和其他线程一起共享进程上下文的剩余部分。这包括这个用户虚拟地址空间,它是由只读文本(代码)、读/写数据、堆以及所有的共享库代码和数据区域组成的。线程也共享同样的打开文件集合。

变量映射到存储器

    线程化的C程序中变量根据它们的存储类型被映射到虚拟存储器中。

  • 全局变量:全局变量是定义在函数之外的变量。在运行时,虚拟存储器的读/写区域只包含每个全局变量的一个实例,任何线程都可以引用。
  • 本地自动变量:本地自动变量就是定义在函数内部但是没有static属性的变量。在运行时,每个线程的栈都包括它自己的所有本地自动变量的实例。即使当多个线程同一个线程例程也是如此。
  • 本地静态变量:是本地静态变量是定义在函数内部并有static属性的变量。和全局变量一样,虚拟存储器的读/写只包含在程序中声明的每个本地静态变量的一个实例。

线程安全

    一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。

线程不安全函数类:

     1.不保护共享函数。

     2.保持跨越多个调用的状态的函数。

     3.返回指向静态变量的指针的函数。

     4.调用线程不安全的函数。

可重入函数

一类重要的线程安全函数,其特点在于他们具有这样一种属性:当它们被多个线程调用时,不会引用任何共享数据。

参考资料

    《深入理解计算机系统》第12章并发编程。

时间: 2024-08-26 07:28:18

并发编程学习记录的相关文章

Windows API 编程学习记录<二>

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录<三>

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

Java并发编程学习笔记

Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现Runnable接口并编写run方法,使得该任务可以执行你的命令.   class MyTask implements Runnable {    private String mName;     public MyTask(String name) {    mName = name;   }  

Java并发编程学习笔记(一)线程安全性 1

什么是线程安全性: 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问."共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以发生变化. 一个对象是否需要线程安全的,取决于他是否被多个线程访问.这指的是在程序中访问对象的方式,而不是对象要实现的功能.要使得对象时线程安全的,需要采用同步机制来协同对对象可变状态的访问.如果无法实现协同,那么可能导致数据破坏以及其他不该出现的结果. 如果当多个线程访

java并发编程学习:用 Semaphore (信号量)控制并发资源

并发编程这方面以前关注得比较少,恶补一下,推荐一个好的网站:并发编程网 - ifeve.com,上面全是各种大牛原创或编译的并发编程文章. 今天先来学习Semaphore(信号量),字面上看,根本不知道这东西是干啥的,借用 并发工具类(三)控制并发线程数的Semaphore一文中的交通红绿信号灯的例子来理解一下: 一条4车道的主干道,假设100米长,每辆车假设占用的长度为10米(考虑到前后车距),也就是说这条道上满负载运行的话,最多只能容纳4*(100/10)=40辆车,如果有120辆车要通过的

Java并发编程学习路线

一年前由于工作需要从微软技术栈入坑Java,并陆陆续续做了一个Java后台项目,目前在搞Scala+Java混合的后台开发,一直觉得并发编程是所有后台工程师的基本功,所以也学习了小一年Java的并发工具,对整体的并发理解乃至分布式都有一定的提高,所以想和大家分享一下. 我的学习路线 首先说说学习路线,我一开始是直接上手JCIP(Java Concurrency in Practice),发现不是很好懂,把握不了那本书的主线,所以思索着从国内的作者开始先,所以便读了下方腾飞的<Java并发编程的艺

并发编程学习

1,java内存模型(JMM):主内存与工作内存:主内存存储了所有变量,每条线程有自己的工作内存,工作内存保存在被线程使用的变量和主内存变量的副本,线程操作必须在工作内存中进行,不能直接读取主内存而线程间的值传递需要主内存. ,内存操作有8条语句均是原子的. 2,线程同步的方法(多个线程对共享数据的竞争是线程不安全的因素) 线程同步总体可分为有锁同步和无锁同步.有锁同步就是加锁,主要包括synchronized,lock,信号量:无锁同步主要包括CAS,MVCC(参见数据库),volatile,

学习笔记:java并发编程学习之初识Concurrent

一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验,所以我就一起帮着分析.最开始看到这个时很烦燥啊,因为自己接触java时间很短,连synchronized都不知道怎么用呢,突然发现有这么个复杂的东西.当时就只好开始学习吧,毕竟是使用嘛,第一目的就是了解清楚这玩意的各个类与方法都干嘛用的,然后看了看同事的代码大概也就清楚了.感觉这和大部分人一样,能

Java并发指南开篇:Java并发编程学习大纲

Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中涉及到的技术原理十分丰富.为了更好地把并发知识形成一个体系,也鉴于本人没有能力写出这类文章,于是参考几位并发编程专家的博客和书籍,做一个简单的整理. 一:并发基础和多线程 首先需要学习的就是并发的基础知识,什么是并发,为什么要并发,多线程的概念,线程安全的概念等. 然后学会使用Java中的Threa