LINUX 多线程
多线程
__2得很别致
__慢热
展开
-
Linux多线程5-5_线程与fork
一、概述1、当线程调用fork函数时,就为子进程创建了整个进程地址空间的副本,子进程通过继承整个地址空间的副本,也会将父进程的互斥量、读写锁、条件变量的状态继承过来。也就是说,如果父进程中互斥量是锁着的,那么在子进程中互斥量也是锁着的(尽管子进程自己还没有来得及lock),这是非常不安全的,因为不是子进程自己锁住的,它无法解锁。2、子进程内部只有一个线程,由父进程中调用fork函数的线程副...原创 2019-12-26 21:20:45 · 135 阅读 · 0 评论 -
Linux多线程5-4_线程私有数据
一、什么是私有数据应用程序设计中有必要提供一种变量,使得多个函数多个线程都可以访问这个变量(看起来是个全局变量),但是线程对这个变量的访问都不会彼此产生影响(貌似不是全局变量哦),但是你需要这样的数据,比如errno。那么这种数据就是线程的私有数据,尽管名字相同,但是每个线程访问的都是数据的副本。二、如何创建私有数据1、在使用私有数据之前,你首先要创建一个与私有数据相关的键,要来获取对私...原创 2019-12-26 21:19:48 · 98 阅读 · 0 评论 -
Linux多线程5-3_线程的同步属性
一、互斥量的属性就像线程有属性一样,线程的同步互斥量也有属性,比较重要的是进程共享属性和类型属性。互斥量的属性用pthread_mutexattr_t类型的数据表示,当然在使用之前必须进行初始化,使用完成之后需要进行销毁:1)、互斥量初始化int pthread_mutexattr_init(pthread_mutexattr_t *attr);2)、互斥量销毁int pthread_...原创 2019-12-26 21:19:10 · 192 阅读 · 0 评论 -
Linux多线程5-2_线程属性
一、线程有哪些属性线程的属性用pthread_attr_t类型的结构表示,在创建线程的时候可以不用传入NULL,而是传入一个pthread_attr_t结构,由用户自己来配置线程的属性。pthread_attr_t类型对应用程序是不透明的,也就是说应用程序不需要了解有关属性对象内部结构的任何细节,因而可以增加程序的可移植性 线程属性 名称 ...原创 2019-12-26 21:18:22 · 133 阅读 · 0 评论 -
Linux多线程5-1_一次性初始化
一、为什么要使用一次性初始化有些事需要且只能执行一次(比如互斥量初始化)。通常当初始化应用程序时,可以比较容易地将其放在main函数中。但当你写一个库函数时, 就不能在main里面初始化了,你可以用静态初始化,但使用一次初始(pthread_once_t)会比较容易些。二、如何进行一次性初始化1、首先要定义一个pthread_once_t变量,这个变量要用宏PTHREAD_ONCE_...原创 2019-12-26 21:15:57 · 170 阅读 · 0 评论 -
Linux多线程4-3_条件变量
一、为什么要使用条件变量一个典型的实例:在一条生产先线上有一个仓库,当生产者生产的时候需要锁住仓库独占,而消费者取产品的时候也要锁住仓库独占。如果生产者发现仓库满了,那么他就不能生产了,变成了阻塞状态。但是此时由于生产者独占仓库,消费者又无法进入仓库去消耗产品,这样就造成了一个僵死状态。 我们需要一种机制,当互斥量被锁住以后发现当前线程还是无法完成自己的操作,那么它应该释放互斥量,让...原创 2019-12-26 21:14:37 · 131 阅读 · 0 评论 -
Linux多线程4-2_读写锁
一、读写锁的概念1、读写锁与互斥量类似,不过读写锁有更高的并行性。互斥量要么加锁要么不加锁,而且同一时刻只允许一个线程对其加锁。对于一个变量的读取,完全可以让多个线程同时进行操作2、pthread_rwlock_t rwlock读写锁有三种状态,读模式下加锁,写模式下加锁,不加锁。一次只有一个线程可以占有写模式下的读写锁,但是多个线程可以同时占有读模式的读写锁3、读写锁在写加锁...原创 2019-12-26 21:13:09 · 153 阅读 · 0 评论 -
Linux多线程4-1_互斥量
一、为什么要使用互斥量1、当多个线程共享相同的内存时,需要每一个线程看到相同的视图。当一个线程修改变量时,而其他线程也可以读取或者修改这个变量,就需要对这些线程同步,确保他们不会访问到无效的变量2、在变量修改时间多于一个存储器访问周期的处理器结构中,当存储器的读和写这两个周期交叉时,这种潜在的不一致性就会出现。当然这与处理器相关,但是在可移植的程序中并不能对处理器做出任何假设二、互斥量...原创 2019-12-26 21:12:27 · 135 阅读 · 1 评论 -
Linux多线程3-5_线程清理操作
一、概念1、线程可以安排它退出时的清理操作,这与进程的可以用atexit函数安排进程退出时需要调用的函数类似。这样的函数称为线程清理处理程序。线程可以建立多个清理处理程序,处理程序记录在栈中,所以这些处理程序执行的顺序与他们注册的顺序相反pthread_cleanup_push(void (rtn)(void), void *args)//注册处理程序pthread_cleanup_pop...原创 2019-12-26 21:11:21 · 293 阅读 · 0 评论 -
Linux多线程3-4_向线程发送信号
一、发送信号的函数int pthread_kill(pthread_t thread, int sig);1、别被名字吓到,pthread_kill可不是kill,而是向线程发送signal。还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用sigaction()去抓信号并加上处理函数。 2、向指定ID的线程发送sig信号,如果线程代码内不做处理,则...原创 2019-12-26 21:10:11 · 2489 阅读 · 0 评论 -
Linux多线程3-3_线程取消
一、线程取消将正在运行的线程取消执行,一个线程可以取消另一个线程,线程也可以自己取消自己。当线程被取消之后,会调用清理函数二、取消函数int pthread_cancel(pthread_t tid)取消tid指定的线程,成功返回0。但是取消只是发送一个请求,并不意味着等待线程终止,而且发送成功也不意味着tid一定会终止三、取消状态1、概念取消状态,就是线程对取消信号的处理方式,忽略...原创 2019-12-26 21:09:25 · 180 阅读 · 0 评论 -
Linux多线程3-2_线程连接
一、线程连接的作用int pthread_join(pthead_t tid, void **rval)1、调用该函数的线程会一直阻塞,直到指定的线程tid调用pthread_exit、从启动例程返回或者被取消参数tid就是指定线程的id参数rval是指定线程的返回码,如果线程被取消,那么rval被置为PTHREAD_CANCELED该函数调用成功会返回0,失败返回错误码2、调用pth...原创 2019-12-26 21:07:52 · 149 阅读 · 0 评论 -
Linux多线程3-1_线程终止
一、exit是危险的如果进程中的任意一个线程调用了exit,_Exit,_exit,那么整个进程就会终止二、不终止进程的退出方式普通的单个线程有一下3中方式退出,这样不会终止进程(1)从启动例程中返回,返回值是线程的退出码(2)线程可以被同一进程中的其他线程取消(3)线程调用pthread_exit(void *rval)函数,rval是退出码void pthread_exit(vo...原创 2019-12-26 21:06:45 · 166 阅读 · 0 评论 -
Linux多线程2-2_线程的生命周期
一、初始线程/主线程1、当c程序运行时,首先运行main函数。在线程代码中,这个特殊的执行流被称作初始线程或者主线程。你可以在初始线程中做任何普通线程可以做的事情。2、主线程的特殊性在于,它在main函数返回的时候,会导致进程结束,进程内所有的线程也将会结束。这可不是一个好的现象,你可以在主线程中调用pthread_exit函数,这样进程就会等待所有线程结束时才终止。3、主线程接受参数的方式...原创 2019-12-26 21:03:38 · 167 阅读 · 0 评论 -
Linux多线程2-1---创造新线程
一、线程的IDpthread_t:结构体(FreeBSD5.2、Mac OS10.3)/unsigned long int(linux)/usr/include/bits/pthreadtypes.h获取线程ID:pthread_self()一个实例:获取主线程ID#include "apue.h"int main(){ pid_t pid; pthread_t ...原创 2019-12-26 21:02:23 · 131 阅读 · 1 评论 -
LINUX多线程1-2---线程的概念
一、什么是线程进程:一个正在执行的程序,它是资源分配的最小单位进程中的事情需要按照一定的顺序逐个进行,那么如何让一个进程中的一些事情同时执行?服务器的例子线程:有时又称轻量级进程,程序执行的最小单位,系统独立调度和分派cpu的基本单位,它是进程中的一个实体。一个进程中可以有多个线程,这些线程共享进程的所有资源,线程本身只包含一点必不可少的资源。进程出现了很多弊端,一是由于进程是资源拥有者,...原创 2019-12-26 21:05:10 · 98 阅读 · 0 评论 -
LINUX多线程1-1---进程的概念
1、 什么是进程一个正在运行的程序就是一个进程2、 并发、并行、异步、同步、临界区并发:针对一个处理器,看起来同时进行。一个处理器在同一时刻只能执行一个程序,但是CPU在多个进程之间快速切换,所以看起是同时进行的。这是一种假象并行:针对多个处理器,一台机器上有多个处理器,那么进程就有可能同时执行。异步:是两个完全没有关系的操作。同步:如果两个操作不应该同时发生,就需要有一种机制确保他们...原创 2019-12-26 21:00:25 · 90 阅读 · 0 评论