pthread

线程

﹥>﹥吖頭↗ 提交于 2019-11-29 12:21:04
gcc filename -lpthread 创建线程 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 的参数 线程等待 int pthread_join(pthread_t tid,void **rval_ptr) 功能 阻塞调用线程,直到指定的线程终止 Tid 等待退出的线程id Rval_ptr 线程退出的返回值的指针 线程标识 pthread_t pthread_self(void) 没有参数,返回值就为当前线程ID 清除 //先进后出 从pthread_cleanup_push的调用点到pthread_cleanup_pop 之间的程 序 段中的终止运作(包括调用pthread_exit()和异常终止, 不包括return ) 都将执行pthread_cleanup_push()所指定的清理函数。 void pthread_cleanup_push(void(*rtn)(void*),void*arg) 功能 将清除函数压入清除栈 Rtn 清除函数 Arg 清除函数的参数 void pthread

进程线程等学习笔记

柔情痞子 提交于 2019-11-29 12:19:56
总共分为12部分分别是:进程、线程、消息队列、信号量集、共享内存、PGSQL编程、MYSQL编程、网络编程、文件访问、标准I/O、系统数据文件和信息、信号 (一) 进程 1. 进程ID为0的进程通常是调度进程,常常被称为交换进程 进程ID为1的进程通常是init进程,在自举过程结束时由内核调用 进程ID为2的进程页守护进程,负责支持虚拟存储系统的分页操作 2. pid_t getpid( void ); 返回值:调用进程的进程ID #include <unistd.h> 3. pid_t getppid( void ); 返回值:调用进程的父进程ID 4. uid_t getuid( void ); 返回值:调用进程的实际用户ID 5. uid_t geteuid( void ); 返回值:调用进程的有效用户ID 6. gid_t getgid( void ); 返回值:调用进程的实际组ID 7. gid_t getegid( void ); 返回值:调用进程的有效组ID 8. pid_t fork( void );创建子进程,返回值:子进程返回0,父进程返回子进程ID,出错-1 9. #include<sys/wait.h> pid_t wait(int *statloc);//statloc 保存进程终止状态的指针 10. #include<sys/wait.h>pid_t

linux中pthread_join()与pthread_detach()详解

ⅰ亾dé卋堺 提交于 2019-11-29 08:28:50
前言: 1.linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。 2.unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己, 如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为 joinable,然后适时调用pthread_join. 3.其实简单的说就是在线程函数头加上 pthread_detach(pthread_self())的话,线程状态改变,在函数尾部直接 pthread_exit线程就会自动退出。省去了给线程擦屁股的麻烦。 eg: pthread_t tid; int status = pthread_create(&tid, NULL, ThreadFunc, NULL); if(status != 0) { perror("pthread_create error"

linux 条件变量

为君一笑 提交于 2019-11-29 04:22:53
在多线程编程中仅使用互斥锁来完成互斥是不够用的, 如以下情形: 假设有两个线程 t1 和 t2 , 需要这个两个线程循环对一个共享变量 sum 进行自增操作,那么 t1 和 t2 只需要使用互斥量即可保证操作正确完成,线程执行代码如所示: pthread_mutex_t sumlock= PTHREAD_MUTEX_INITIALIZER; void * t1t2(void) {   pthread_mutex_lock(&sumlock);   sum++;   pthread_mutex_unlock(&sumlock); } 如果这时需要增加另一个线程 t3 ,需要 t3 在 count 大于 100 时将 count 值重新置 0 值,那么可以 t3 可以实现如下: void * t3 (void) {   pthread_mutex_lock(&sumlock);   if (sum >= 100) {     sum = 0;     pthread_mutex_unlock(&sumlock);   } else {     pthread_mutex_unlock(&sumlock);     usleep(100);   } } 以上代码存在以下问题: 1) sum 在大多数情况下不会到达 100 , 那么对 t3 的代码来说 , 大多数情况下, 走的是 else

[转]c++ pthread 多线程简介

a 夏天 提交于 2019-11-29 04:12:37
链接: https://blog.csdn.net/u013894427/article/details/83827173 pthread 入口函数类型说明 void * func1(void * t) void* 表示无类型指针 void*作为函数参数,表示函数接收一个指针,不管是什么类型的指针都可以,但是传递之前要强制转换为无类型指针。 基础流程 pthread_t t1;//声明一个线程 pthread_create(&t1, NULL, &test, (void *)this);//创建一个线程 pthread_exit(NULL);//退出线程 pthread_create() 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 含有四个参数, 第一个参数表示线程id 第二个参数表示线程参数 第三个是线程的入口函数名字 第四个参数表示线程入口函数的参数名字 pthread_exit(); 函数原型 void pthread_exit(void *retval) 写在线程内部,用于强制退出当前线程 如果线程是joinable,可以在函数参数里面传递线程的退出信息给主线程 例如 #include

线程安全

拜拜、爱过 提交于 2019-11-29 03:36:59
线程安全 可重入/不可重入:针对函数,多个执行流中是否可以同时进入函数运行而不出现问题 概念:指多个线程同时处理操作临界资源而不会出现数据二义性,则称是线程安全的 二义性:在线程中是否对临界资源进行了非原子操作 如何实现线程安全: 同步(保证合理):临界资源的合理访问(时序可控) 互斥(保证安全):临界资源同一时间唯一访问 如何实现互斥:(首先自身是安全的) 互斥锁:(黄牛抢票程序) 使用一个0/1的原子操作的计数器(图片): 1 -> 表示可以加锁,加锁就是计数-1 . 操作完毕后要解锁,解锁就是计数+1 0 -> 表示不可以加锁,不能加锁则等待 操作步骤: 1.定义互斥锁变量 pthread_mutex_t mutex; 2.初始化互斥锁变量 int pthread_mutex_init() 3.加锁/解锁--->要在临界资源访问之前进行 阻塞加锁,加不上锁就阻塞: int pthread_mutex_lock() 非阻塞加锁,加不上则直接报错返回: int pthread_mutex_trylock() 限时阻塞加锁: int pthread_mutex_timedlock() *加锁之后要在线程任意有可能退出的地方解锁 解锁: int pthread_mutex_unlock() 4.销毁互斥锁 int pthread_mutex_destroy() 死锁:

线程整理

余生长醉 提交于 2019-11-29 03:19:19
一、 1、 Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。(在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置)。 2、 线程属性 pthread_attr_t 。 ( 1)在/usr/include/bits/pthreadtypes.h文件中的pthread_attr_t的定义为: typedef union { char __size[__SIZEOF_PTHREAD_ATTR_T]; long int __align; } pthread_attr_t; 由于pthread不想让用户空间看到它内部对pthread_attr_t的实现,因为API设计时就封装了这个类型。所以它只要提供和内部实现的pthread_attr_t大小一样的类型就可以了。 ( 2)其与下定义相同,内容基本上是一致,且结构体的大小是相等的。 typedef struct { int __detachstate; 线程的分离状态 int __schedpolicy; 线程调度策略 struct sched_param __schedparam; 线程的调度参数 int __inheritsched; 线程的继承性 Int __scope; 线程的作用域 size_t __guardsize;

Linux线程间同步的几种方式

删除回忆录丶 提交于 2019-11-29 02:43:27
信号量 信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量时,也可以完成一个资源的互斥访问。信号量测重于访问者对资源的有序访问,在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 有名信号量 可以用于不同进程间或多线程间的互斥与同步 创建打开有名信号量 sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); //成功返回信号量指针;失败返回SEM_FAILED,设置errno name是文件路径名,但不能写成/tmp/a.sem这样的形式,因为在linux下,sem都是在/dev/shm目录下,可写成"/mysem"或"mysem",创建出来的文件都是"/dev/shm/sem.mysem",mode设置为0666,value设置为信号量的初始值.所需信号灯等已存在条件下指定O_CREAT|O_EXCL却是个错误。 关闭信号量,进程终止时,会调用它 int sem

pthread_join和pthread_detach的用法 【】转载】

一笑奈何 提交于 2019-11-29 01:51:13
原 C/C++:pthread_join()和pthread_detach()的区别 2018年08月23日 16:01:12 everlastxc 阅读数 3192 更多 分类专栏: C/C++ 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_29621351/article/details/81948850 简单来说:pthread_detach()和pthread_join()就是控制子线程回收资源的两种不同的方式。同一进程间的线程具有共享和独立的资源,其中共享的资源有堆、全局变量、静态变量、文件等公用资源。而独享的资源有栈和寄存器,这两种方式就是决定子线程结束时如何回收独享的资源。 pthread_detach()即主线程与子线程分离,两者相互不干涉,子线程结束同时子线程的资源自动回收。pthread_join()即是子线程合入主线程,主线程会一直阻塞,直到子线程执行结束,然后回收子线程资源,并继续执行。 代码编译过程为(文件取名main.cc) /** 编译 -lpthread为链接pthread**/g++ -o a.out main.cc -lpthread/** 执行 **/./a.out linux下内存占用查看指令为 /**

线程相关笔记

◇◆丶佛笑我妖孽 提交于 2019-11-29 00:45:52
当主线程先于其它进程执行 pthread_exit() 时,进程还不会退出,只有最后一个线程也完成了,进程才会退出。执行exit()或者在主线程执行return,会立即终止进程的执行。 pthread_create()的第四个形参是线程函数的形参 一个可“join”的线程所占用的内存仅当有线程对其执行立pthread_join()后才会释放,因此为了避免内存泄漏,所有线程的终止时,要么已被设为DETACHED,要么使用pthread_join()来回收资源。 一个线程不能被多个线程等待,否则第一个接受到信号的线程成功返回,其余调用pthread_join()的线程返回错误代码ESRCH void pthread_exit(void* retval); int pthread_join(pthread_t thread, void **retval); pthread_join()参数 retval 的作用是为指向线程的返回值的指针提供一个位置, 这个返回值是目标线程调用 pthread_exit()或者 return 后所返回的值。当目标线程无需返回时可使用 NULL 值,调用线程如果不需对目标线程的返回状态进行检查可直接将 retval 赋值为 NULL。 线程状态 可以分为分离线程(DETACHED)和非分离线程(JOINABLE)两种:   