pthread

三十六、Linux 线程——线程基本概念及线程的创建和终止

青春壹個敷衍的年華 提交于 2020-01-27 17:23:56
36.1 线程介绍 36.1.1 线程的基本概念 进程是资源管理的最小单位,线程是程序执行的最小单位 每个进程都有自己的数据段、代码段和堆栈段。 线程通常叫做轻型的进程,它包含独立的栈和 CPU 寄存器状态,线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源,包括打开的文件、内存页面、信号标识及动态分配的内存等。 因为线程和进程比起来很小,所以相对来说,线程花费更少的 CPU 资源 在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持多处理器,并且减少进程上下文切换的开销。 36.1.2 进程和线程的关系 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一用户内存空间,当进程退出时,该进程所产生的线程都会被强制退出并清除。 一个进程至少需要一个线程作为它的指令执行,进程管理着资源(比如 CPU、内存、文件等等),并将线程分配到某个 CPU 上执行    36.1.3 线程分类 线程按照其调度者可分为用户级线程和内核级线程两种: 用户级线程:主要解决的是上下文切换的问题,其调度过程由用户决定 内核级线程:由内核调度机制实现 现在大多数操作系统都采用用户级线程和内核级线程并存的方法 用户级线程要绑定内核级线程运行,一个进程中的内核级线程会分配到固定的时间片,用户级线程分配的时间片以内核级线程为准 默认情况下,用户级线程和内核级线程是一对一

C多线程编程---条件变量

丶灬走出姿态 提交于 2020-01-27 12:09:37
文章目录 1、原理 2、头文件 3、 函数库 3.1、初始化 3.2、pthread_cond_signal 3.3、pthread_cond_broadcast 3.4、pthread_cond_wait 3.5、pthread_cond_timedwait 3.6、pthread_cond_destroy 3.7、操作步骤: 3.8、举例 1、原理 假设我们需要解决这样一个问题:一个列表记录需要处理的任务。一个线程往此列表添加任务,一个线程processTask处理此列表中的任务。这个问题的一个关键点在于processTask怎么判断任务列表不为空。一般有两种方法: 一. processTask线程不断查询任务列表是否为空。 二. 当列表不为空的时候,通知processTask处理相关任务。 第一种方法往往是在一个while循环中判断列表是否为空,如果为空则睡眠一段时间,如果不为空那么把任务取出来并加以处理。此方案需要一个睡眠时间的平衡点如果睡眠时间太长,任务得不到及时的处理,降低效率。如果睡眠时间过短占用CPU资源,却什么都不做,浪费CPU做其它事情的时间。 第二种方法就比较靠谱了,只有当列表不为空的时候才占用CPU的时间,其它时间什么都不做除了睡觉(线程挂起)。此方案就是我们所说的条件变量(condition variable)。 一般条件变量(condition

C多线程编程---pthread_create pthread_join pthred_exit

时光怂恿深爱的人放手 提交于 2020-01-27 12:08:04
文章目录 1、三个基本API 2、举例 1、三个基本API extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr, void *(*__start_routine) (void *), void *__arg)); 第一个参数为指向线程标识符的指针,后续可以使用该线程标示符来处理线程 第二个参数用来设置线程属性,为NULL,则生成默认属性线程 第三个参数是线程运行函数的起始地址 第四个参数是运行函数的参数,若没有则传入NULL 返回值: 0:成功 EAGAIN:线程数目过多 EINVAL:线程属性值非法 extern int pthread_join __P ((pthread_t __th, void **__thread_return)); 第一个参数为被等待的线程标识符 第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值 extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__)); 唯一的参数是函数的返回代码 2、举例 #include <stdio.h> #include <pthread.h> #include <stdlib.h> void

条件锁pthread_cond_t

十年热恋 提交于 2020-01-25 17:48:52
http://egeho123.blogbus.com/logs/10821816.html 2006年09月05日 12:42 说明, 等待线程 1。使用pthread_cond_wait前要先加锁 2。pthread_cond_wait内部会解锁,然后等待条件变量被其它线程激活 3。pthread_cond_wait被激活后会再自动加锁 激活线程: 1。加锁(和等待线程用同一个锁) 2。pthread_cond_signal发送信号 3。解锁 激活线程的上面三个操作在运行时间上都在等待线程的pthread_cond_wait函数内部。 程序示例: #include <stdio.h> #include <pthread.h> #include <unistd.h> pthread_mutex_t count_lock; pthread_cond_t count_nonzero; unsigned count = 0; void * decrement_count(void *arg) { pthread_mutex_lock (&count_lock); printf("decrement_count get count_lock\n"); while(count==0) { printf("decrement_count count == 0 \n"); printf(

Linux 平台多线程编程实例

落爺英雄遲暮 提交于 2020-01-25 09:28:53
转载请注明出去 http://blog.csdn.net/adong76/article/details/39828585 参考博客: http://www.cnblogs.com/armlinux/archive/2010/05/28/2396997.html http://blog.csdn.net/hitwengqi/article/details/8015646 http://www.vimer.cn/2009/11/linux%E4%B8%8B%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA%E4%B8%8E%E7%AD%89%E5%BE%85%E8%AF%A6%E8%A7%A3.html http://www.cnblogs.com/skynet/archive/2010/10/30/1865267.html http://www.cnblogs.com/vamei/archive/2012/10/09/2715393.html 最近在优化一个图像处理算法,算法中要对于不同的图片做相同的图像处理算法,不同图片之间的处理数据时独立的,因而很自然的想到利用多线程优化算法。 下面是一些学习代码 一 Linux下面的多线编程需要包含明白以下几点: 1 pthread_t pthread_t在头文件/usr

高并发的epoll+线程池,线程池专注实现业务

折月煮酒 提交于 2020-01-25 02:05:18
我们知道,服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指“I/O线程”,即负责I/O操作,协调分配任务的“管理线程”,而实际的请求和任务通常交由所谓“工作者线程”处理。通常多线程模型下,每个线程既是I/O线程又是工作者线程。所以这里讨论的是,单I/O线程+多工作者线程的模型,这也是最常用的一种服务器并发模型。我所在的项目中的server代码中,这种模型随处可见。它还有个名字,叫“半同步/半异步“模型,同时,这种模型也是生产者/消费者(尤其是多消费者)模型的一种表现。 这种架构主要是基于 I/O多路复用 的思想(主要是epoll,select/poll已过时),通过单线程I/O多路复用,可以达到高效并发,同时避免了多线程I/O来回切换的各种开销,思路清晰,易于管理,而基于线程池的多工作者线程,又可以充分发挥和利用多线程的优势,利用线程池,进一步提高资源复用性和避免产生过多线程。 瓶颈在于IO密集度 。 线程池你开10个线程当然可以一上来全部accept阻塞住,这样客户端一连上来便会自动激活一个线程去处理,但是设想一下,如果10个线程全部用掉了,第11个客户端就会发生丢弃。这样为了实现”高并发“你得不断加大线程池的数量。这样会带来严重的内存占用和线程切换的时延问题。 于是前置事件轮询设施的方案就应运而生了, 主线程轮询负责IO,作业交给线程池。 在高并发下

哲学家就餐问题、银行家算法、读者写者问题、生产者消费者问题

好久不见. 提交于 2020-01-25 00:29:04
哲学家就餐问题、银行家算法、读者写者问题、生产者消费者问题 哲学家就餐问题 解题思路 问题解决 方法一 方法二 方法三 银行家算法 安全状态 银行家算法的数据结构 银行家算法 安全性算法 银行家算法实例 读者写者问题 方法1:利用记录型信号量解决读者--写者问题 方法2:利用信号量集解决读者--写者问题 生产者消费者问题 哲学家就餐问题 该问题描述的是五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。 解题思路 因为是五位哲学家,并且每位哲学家的各自做自己的事情(思考和吃饭),因此可以创建五个线程表示五位哲学家,五个线程相互独立(异步)。并对五位哲学家分别编号为0~4。 ​ 同时,有五根筷子,每根筷子只对其相邻的两位哲学家是共享的,因此这五根筷子可以看做是五种不同的临界资源(不是一种资源有5个,因为每根筷子只能被固定编号的哲学家使用)。并对五根筷子分别编号为0~4,其中第i号哲学家左边的筷子编号为i,则其右边的筷子编号就应该为(i + 1) % 5。 ​ 因为筷子是临界资源,因此当一个线程在使用某根筷子的时候,应该给这根筷子加锁,使其不能被其他进程使用。 ​ 根据以上分析,可以使用pthread

线程本地存储及实现原理

末鹿安然 提交于 2020-01-24 21:10:54
本文是《go调度器源代码情景分析》系列 第一章 预备知识的第十小节,也是预备知识的最后一小节。 线程本地存储又叫线程局部存储,其英文为Thread Local Storage,简称TLS ,看似一个很高大上的东西,其实就是线程私有的全局变量而已。 有过多线程编程的读者一定知道,普通的全局变量在多线程中是共享的,一个线程对其进行了修改,所有线程都可以看到这个修改,而线程私有的全局变量与普通全局变量不同,线程私有全局变量是线程的私有财产,每个线程都有自己的一份副本,某个线程对其所做的修改只会修改到自己的副本,并不会修改到其它线程的副本。 下面用例子来说明一下多线程共享全局变量以及线程私有全局变量之间的差异,并对gcc的线程本地存储做一个简单的分析。 首先来看普通的全局变量 #include <stdio.h> #include <pthread.h> int g = 0; // 1,定义全局变量g并赋初值0 void* start(void* arg) {   printf("start, g[%p] : %d\n", &g, g); // 4,子线程中打印全局变量g的地址和值   g++; // 5,修改全局变量   return NULL; } int main(int argc, char* argv[]) {   pthread_t tid;   g = 100; // 2

Linux多线程程编(一)--创建线程

大城市里の小女人 提交于 2020-01-24 21:10:40
Linux多线程程编已经有成熟的 pthread库进行支持,首先对多线程程编的常用API进行梳理。 线程 并发性和并行性 在单个处理器的多线程进程中,处理器可以在线程之间切换执行资源,从而执行并发 在共享内存的多处理器的多线程进程中,进程中的每一个线程都可以在一个单独的cpu上并发执行。 用户级线程 线程仅在进程内部是可见的,进程内部的线程会共享诸如地址空间、打开的文件等所有进程资源 以下状态对每一个线程来说是唯一的 线程ID 寄存器状态 栈 信号掩码 优先级 线程专用储存 常用API 线程主要关注的点有三个,线程的创建,线程的退出以及线程等待 ,在linux下需要引用头文件 #include <pthread.h> 创建线程 int pthread_create(pthread_t *tidp,const pthread_attr_t *attr, (void*)(*start_rtn)(void*),void *arg); 编译链接选项 -lpthread,由于pthread库不是Linux系统的默认库,而是POSIX的线程库,因此在编译的时候需要加上-lpthread或者-pthread来显示链接该库,函数在执行错误的时候并不会修改系统错误信息errno而是返回错误值。 入参解析 1.pthread_t tidp 线程ID的指针,对于每一个线程来说是唯一的 2.pthread

多线程

跟風遠走 提交于 2020-01-24 21:10:27
Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a。 1.创建线程 #include <pthread.h> int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_rtn)(void), void *arg) 参数说明: tidp:线程id attr:线程属性(通常为空) start_rtn:线程要执行的函数 arg:start_rtn的参数 thread_create.c #include <stdio.h>#include <pthread.h>void *myThread1(void){ int i; for (i=0; i<100; i++) { printf("This is the 1st pthread,created by zieckey.\n"); sleep(1);//Let this thread to sleep 1 second,and then continue to run }}void *myThread2(void){ int i; for (i=0; i<100; i++) { printf("This is the 2st