pthread

[TLPI] C30 Thread: Introduction

混江龙づ霸主 提交于 2019-11-28 22:30:24
目录 Threads: Introduction Overview Background Details of the Pthreads API Thread Creation Thread Termination Thread IDs Joining with a Terminated Thread Detaching a Thread Thread Attributes Threads versus Processes Exercises Threads: Introduction Overview 同一个进程内的所有线程相互独立运行,执行着相同的程序,所有的线程共享相同的内存,包括初始化过的数据、未初始化的数据以及堆区(一个传统的UNIX进程是一特殊多线程进程,该进程只包括一个线程)。 在Figure 29-1中有一些简化。在实际中,每个线程的栈区可能会混入共享库以及共享内存区,这取决于线程创建的顺序、共享库被加载的顺序、共享内存区被使用的顺序。此外,每个线程的栈区分布也和Linux发行版有关。 同一个进程内的线程可以并发执行。在一个多处理器系统上,多个线程可以并行执行。如果某个线程因为IO而阻塞,其他的线程依然能够执行。 相对于进程,线程提供了很多优势。试着想想传统的UNIX编程里,通过创建多个进程来实现并发。其中一个例子,是网络服务器的设计,当接收到来自客户端的连接请求后

线程

人走茶凉 提交于 2019-11-28 21:54:44
线程 文章目录 线程 1 概述 1.1 线程机制分类和特性 1.2 线程标识 2 线程编程 2.1 线程基本编程 3 线程间的同步与互斥 3.1 互斥锁线程控制 3.2 信号量线程控制 4 线程属性 4.1 概述 4.2 函数 5 生产者消费者实验 5.1 概述 5.2 解决方案 5 生产者消费者实验 5.1 概述 5.2 解决方案 1 概述 线程进程内独立的一条运行路线,处理器调度的小单元,也可以称为轻量级进程。线程可以对进程的内存空间和资 源进行访问,并与同一进程中的其他线程共享。 典型进程只有一个控制线程,有多个控制线程后,进程在某一时刻能做不止一件事。 为每种事件类型分配单独的处理线程,可简化处理异步事件的代码。 多个线程可自动访问相同的存储地址空间和文件描述符。一个进程的所有信息对进程的所有线程共享。 分解问题从而提高程序吞吐量,单线程进程完成多任务需把任务串行化,而多线程中相互独立的处理可以交叉进行。 使用多线程可改善响应时间。 注 :多线程程序在单处理器上运行也能改善响应时间和吞吐量。 1.1 线程机制分类和特性 用户级线程 :用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定。如果一个进程中的某一个线程调用了一个阻塞 的系统调用函数,那么该进程包括该进程中的其他所有线程也同时被阻塞。主要缺点是无法发挥多处理器的优势。 轻量级线程

pthread_once函数

早过忘川 提交于 2019-11-28 18:08:21
http://blog.csdn.net/lmh12506/article/details/8452659 pthread_once()函数详解 在多线程环境中,有些事仅需要执行一次。通常当初始化应用程序时,可以比较容易地将其放在main函数中。但当你写一个库时,就不能在main里面初始化了,你可以用静态初始化,但使用一次初始化(pthread_once)会比较容易些。 int pthread_once(pthread_once_t *once_control, void (*init_routine) (void)); 功能:本函数使用初值为PTHREAD_ONCE_INIT的once_control变量保证init_routine()函数在本进程执行序列中仅执行一次。 在多线程编程环境下,尽管pthread_once()调用会出现在多个线程中,init_routine()函数仅执行一次,究竟在哪个线程中执行是不定的,是由内核调度来决定。 Linux Threads使用互斥锁和条件变量保证由pthread_once()指定的函数执行且仅执行一次,而once_control表示是否执行过。如果once_control的初值不是PTHREAD_ONCE_INIT(Linux Threads定义为0),pthread_once() 的行为就会不正常。在LinuxThreads中,实际

epoll完整例子

会有一股神秘感。 提交于 2019-11-28 13:45:48
#include <deque> #include <map> #include <vector> #include <pthread.h> #include <semaphore.h> #include <time.h> #include <sys/time.h> #include <sys/shm.h> #include <errno.h> #include <sys/types.h> #include <fcntl.h> #include <stdio.h> #include <string> #include <cstdio> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <cstdlib> #include <cctype> #include <sstream> #include <utility> #include <stdexcept> #include <sys/socket.h> #include <sys/epoll.h> #include <netinet/in.h> #include <arpa/inet.h> #include <iostream> #include <signal.h> using

Linux c线程

非 Y 不嫁゛ 提交于 2019-11-28 07:21:00
1、pthread_create 2、pthread_join 3、sem_init sem_destroy 4、sem_post sem_wait 5、所有线程可以共同访问全局区 --------------------------------------------------------------------------------- 【1】程序:静态存储在磁盘上 进程:程序动态执行时 线程:可以将进程划分成多个子任务执行 【2】线程是依附于进程存在的 多个线程共同享有进程的内存空间 其中全局区可以被所有的线程访问 【3】线程的创建 int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能:在当前进程(主线程)内开启一个新的线程(副线程)。 参数:thread:存储线程ID attr:NULL,默认的线程属性:8M的栈空间 start:传一个函数名,线程的执行体 arg:NULL 返回:成功返回0,失败非0 注意:编译时加 -pthread 【4】int pthread_join(pthread_t thread, void **retval); 功能:阻塞等待一个线程的退出,当该线程结束则唤醒等待 参数:thread

进程间通信之-----信号量

我怕爱的太早我们不能终老 提交于 2019-11-28 03:40:49
进程间通信简单的说有三个问题,第一个问题是:一个进程如何把信息传递给另一个,第二个问题是:要确保两个或者更多的进程在互动中不会出现交叉(即是进程互斥问题),第三个问题是:进程间同步问题、 四种进程或者线程同步互斥的控制方法 1):临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2):互斥量:为协调共同对一个共享资源的单独访问而设计的 3):信号量:为控制一个具有有限数量用户资源而设计 4):事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界区(Critical Section)   保证在某一时刻只有一个线程能访问数据的简便办法,在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开,临界区在被释放后,其他线程可以继续抢占,并以此达到原子方式操作共享资源的目的。   临界区包含两个操作原语: EnterCriticalSection() 进入临界区 LeaveCriticalSection() 离开临界区 虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。 互斥量(Mutex)   互斥量跟临界区很相似,只有拥有互斥量对象的线程才具有访问资源的权限,由于互斥对象只有一个

条件变量

喜你入骨 提交于 2019-11-28 03:37:35
条件变量: 条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。 主要应用函数: pthread_cond_init函数 pthread_cond_destroy函数 pthread_cond_wait函数 pthread_cond_timedwait函数 pthread_cond_signal函数 pthread_cond_broadcast函数 以上6 个函数的返回值都是:成功返回0, 失败直接返回错误号。 pthread_cond_t类型 用于定义条件变量 pthread_cond_t cond; pthread_cond_init函数 初始化一个条件变量 int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); 参2:attr表条件变量属性,通常为默认值,传NULL即可 也可以使用静态初始化的方法,初始化条件变量: pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_cond_destroy函数 销毁一个条件变量 int pthread_cond_destroy(pthread_cond_t *cond); pthread_cond

线程分离

坚强是说给别人听的谎言 提交于 2019-11-28 03:36:20
pthread_detach函数 实现线程分离 int pthread_detach(pthread_t thread); 成功:0;失败:错误号 线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。 进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。 也可使用 pthread_create函数参2(线程属性)来设置线程分离。 【练习】:使用pthread_detach函数实现线程分离 【pthrd_detach.c】 一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态, 这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。 不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。 /*** detach.c ***/ #include<unistd.h> #include<string.h> #include<pthread.h> #include<stdio.h>

线程同步

删除回忆录丶 提交于 2019-11-28 01:01:42
同步概念 所谓同步,即同时起步,协调一致。不同的对象,对“同步”的理解方式略有不同。如,设备同步,是指在两个设备之间规定一个共同的时间参考;数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致;文件同步,是指让两个或多个文件夹里的文件保持一致。等等 而,编程中、通信中所说的同步与生活中大家印象中的同步概念略有差异。“同”字应是指协同、协助、互相配合。主旨在协同步调,按预定的先后次序运行。 线程同步 同步即协同步调,按预定的先后次序运行。 线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。 举例1: 银行存款 5000。柜台,折:取3000;提款机,卡:取 3000。剩余:2000 举例2: 内存中100字节,线程T1欲填入全1, 线程T2欲填入全0。但如果T1执行了50个字节失去cpu,T2执行,会将T1写过的内容覆盖。当T1再次获得cpu继续 从失去cpu的位置向后写入1,当执行结束,内存中的100字节,既不是全1,也不是全0。 产生的现象叫做“与时间有关的错误”(time related)。为了避免这种数据混乱,线程需要同步。 “同步”的目的,是为了避免数据混乱,解决与时间有关的错误。实际上,不仅线程间需要同步,进程间、信号间等等都需要同步机制。 因此, 所有“多个控制流

创建线程

半世苍凉 提交于 2019-11-27 20:54:29
pthread_self函数 获取线程ID。其作用对应进程中 getpid() 函数。 pthread_t pthread_self(void); 返回值:成功:0; 失败:无! 线程ID:pthread_t类型,本质:在Linux下为无符号整数(%lu),其他系统中可能是结构体实现 线程ID是进程内部,识别标志。(两个进程间,线程ID允许相同) 注意:不应使用全局变量 pthread_t tid,在子线程中通过pthread_create传出参数来获取线程ID,而应使用pthread_self。 pthread_create函数 创建一个新线程。 其作用,对应进程中fork() 函数。 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 返回值:成功:0; 失败:错误号 -----Linux环境下,所有线程特点,失败均直接返回错误号。 参数: pthread_t:当前Linux中可理解为:typedef unsigned long int pthread_t; 参数1:传出参数,保存系统为我们分配好的线程ID 参数2:通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。 参数3:函数指针