POSIX 线程编程(一)简介

简介

在共享内存的多处理器结构中,可以用线程来实现并行。对于UNIX系统, IEEE POSIX 1003.1c标准规定了C语言线程编程接口的标准。这份标准的实现就是POSIX threads, 或者称为Pthreads.

本文开始先介绍线程的基本概念,动机和设计方面的一些考虑。 接下来是Pthreads API 的三个主要部分:线程管理,互斥锁和 条件变量。本文自始至终会贯穿大量的示例代码来展示如何使用Pthread API的每一部分。

Pthreads 概述

线程是什么?

从技术角度讲,一个线程是一个独立的指令流可以被操作系统调用运行。But what does this mean?

从程序员的角度讲,独立于主程序而单独运行的“程序”可以被称为一个线程。

更进一步的讲, 想象一个包含很多子程序的主程序 (a.out) . 然后想象所有这些子程序都能操作系统调用同时并且独立的运行。这就是一个多线程的程序。

这是怎么完成的呢?

在理解线程之前, 先要理解UNIX系统下的进程。 一个进程是由操作系统创建的, 并且要求大量的"开销"。进程包含关于程序资源的信息和程序的执行状态,包括:

进程ID,进程组ID, 用户ID,和组ID

环境

工作目录

程序指令

寄存器

文件描述符

信号操作

共享库

进程通信工具 (例如消息队列,管道,信号量,或者共享内存 ).

UNIX进程                                                                                              线程

线程使用并存在在这些进程资源中,线程可以被操作系统调用并独立运行, 很大程度上是因为它只复制了很少量的作为可执行代码存在的必须重要资源。

一个线程完成独立的控制流是因为它维护自己拥有的:

栈指针

寄存器

调度优先级

待定和阻塞信号集合

线程特有的数据

因此,简而言之,在UNIX系统环境中一个线程:

存在在一个进程中并使用进程资源

只要父进程存在并且操作系统支持就一直拥有自己独立的控制流

仅复制独立调度所必须关键资源

可以和其他线程共享进程资源

如果线程的父进程死掉,则该线程死掉

是“轻量级”的因为大多是开销在它的进程创建的时候已经完成了

同一进程的线程间共享资源,导致:

一个线程对于共享的系统资源所做的更改(例如关闭一个文件)将会被所有其他的线程发现

两个具有相同值的指针指向相同的数据

可能读写相同的内层位置,因此要求程序员进行显式的同步

时间: 2024-10-26 13:30:04

POSIX 线程编程(一)简介的相关文章

POSIX 线程编程(二)线程建立与终止

创建与终止线程 线程的管理常用的API有: pthread_create(thread,attr,start_routine,arg) pthread_exit(status) pthread_cancel(thread) pthread_attr_init(attr) pthread_attr_destroy(attr) 创建线程: 一个main程序包含一个默认的主线程,这个主线程在程序开始运行的时候由系统创建.除此之外的所有其他线程必须由程序员显式的创建. pthread_create 创建

linux网络编程之posix 线程(三)

posix 信号量与互斥锁 示例生产者--消费者问题 一.posix 信号量 信号量的概念参见这里(http://www.bianceng.cn/OS/Linux/201308/37243.htm).前面也讲过system v 信号量,现在来说说posix 信号量. system v 信号量只能用于进程间同步,而posix 信号量除了可以进程间同步,还可以线程间同步.system v 信号量每次PV操作可以是N,但Posix 信号量每次PV只能是1.除此之外,posix 信号量还有命名和匿名之分

使用 Python 进行线程编程 线程的使用模式

简介: 通过将线程和队列 结合在一起,可以轻松地在 Python 中完成线程编程.本文将研究同时使用线程和队列,创建一些简单但有效的模式,以解决需要并发处理的问题. 引言 对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程.进程和异步 I/O 的支持.在许多情况下,通过创建诸如异步.线程和子进程之类的高层模块,Python 简化了各种并发方法的使用.除了标准库之外,还有一些第三方的解决方案,例如 Twisted.Stackless 和进程模块.本文重点关注于使用 Python 的

java线程编程(一):线程基础

在学习java中,我发现有关于对线程的讲解比较少,我打算为一些java初学者提一些关于线程方面的参考, 为深入学习java奠定基础.我本着共同进步的原则特写下了关于java线程编程的一系列文章 java线程编程(一):线程基础 ◆线程(thread)其实是控制线程(thread of control)的缩写. 每一个线程都是独立的,因此线程中的每个方法的局部变量都是和其他线程隔离开的,这些变量完全是私有的,因此对于 线程而言,是没有办法访问其他线程的局部变量的.如果两个线程同时访问同一个方法,则

linux网络编程之posix 线程(二)

线程的属性和 线程特定数据 Thread-specific Data 一.posix 线程属性 POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者可以访问和修改的线程属性.主要包括如下属性: 1. 作用域(scope) 2. 栈尺寸(stack size) 3. 栈地址(stack address) 4. 优先级(priority) 5. 分离的状态(detached state) 6. 调度策略和参数(scheduling policy and para

linux网络编程之posix 线程(一)

pthread 系列函数 和 简单多线程服务器端程序 一.posix 线程概述 我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个"等待-处理"的循环,可以用多线程实现,一个线程专门负责与用户交互,另外几个线程每个线程负

《深入理解Hadoop(原书第2版)》——2.2MapReduce编程模型简介

2.2MapReduce编程模型简介 Hadoop系统支持MapReduce编程模型,这个编程模型由谷歌公司发明,该模型可以利用由大量商用服务器构成的大规模集群来解决处理千兆级数据量的问题.MapReduce模型有两个彼此独立的步骤,这两个步骤都是可以配置并需要用户在程序中自定义: Map:数据初始读取和转换步骤,在这个步骤中,每个独立的输入数据记录都进行并行处理. Reduce:一个数据整合或者加和的步骤.在这个步骤中,相关联的所有数据记录要放在一个计算节点来处理. Hadoop系统中的Map

【转】VC++ ADO编程入门简介

VC++ ADO编程入门简介  一.ADO简介    ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API.DAO.RDO都要容易使用,并不失灵活性.本文将详细地介绍在VC下如何使用ADO来进行数据库应用程序开发,并给出示例代码.    本文示例代码     二.基本流程    万事

Linux线程编程之生产者消费者问题

前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一  顺序表循环队列 1.1 顺序循环队列定义 队列是一种运算受限的先进先出线性表,仅允许在队尾插入(入队),在队首删除(出队).新元素入队后成为新的队尾元素,元素出队后其后继元素就成为队首元素. 队列的顺序存储结构使用一个数组和两个整型变量实现,其结构如下: 1 struct Queue{ 2     ElemType el