pthread_join

UNIX环境编程学习笔记(26)——多线程编程(一):创建和终止线程

风格不统一 提交于 2020-01-24 21:10:01
lienhua34 2014-11-08 在 进程控制三部曲 中我们学习了进程的创建、终止以及获取终止状态等的进程控制原语。线程的控制与进程的控制有相似之处,在表 1中我们列出了进程和线程相对应的控制原语。 表 1: 进程原语和线程原语的比较 进程原语 线程原语 描述 fork pthread_create 创建新的控制流 exit pthread_exit 从现有的控制流中退出 waitpid pthread_join 从控制流中得到退出状态 atexit pthread_cleanup_push 注册在退出控制流时调用的函数 getpid pthread_self 获取控制流的 ID abort pthread_cancel 请求控制流的非正常退出 1 线程 每个线程都有一个线程 ID,线程只在它所属的进程环境中有效。线程ID 使用pthread_t 表示。可以通过调用pthread_self 函数获取线程自身的线程 ID, #include <pthread.h> pthread_t pthread_self(void); 返回值:调用线程的线程ID 线程 ID 不一定是一个非负整数,也有可能是一个结构体。所以,要对比两个线程是否相同,必须使用pthread_equal 函数来进行, #include <pthread.h> int pthread_equal(pthread

8.线程与互斥量

[亡魂溺海] 提交于 2020-01-16 11:06:40
一.基本概念 进程中有哪些资源: 代码段指令,只读段,全局段,静态数据,段,堆,栈,命令行参数,环境变量表,代码的执行者(线程)。 线程:在进程中,负责执行代码的一个单位,它是进程的一部分,一个进程至少要有一个线程(主线程),进程也可以有多个线程(创建) 线程中的代码段指令,只读段,全局段,静态数据,段,堆,命令行参数,环境变量表,文件描述符,信号处理函数,等资源共享 线程之间,栈空间是私有的 线程是进程的一个实体,是操作系统独立调度和分派任务的基本单位。 二.POSIX线程 Unix和Linux是天生骄傲(不支持线程),通过添加额外的线程库可以使用 ,在编译多线程代码时需要添加 -lpthread,头文件pthread.h 对线程的操作: 创建线程 销毁线程 分离线程 联合线程 查询线程属性 设置线程属性 对于线程来说,最重要的是解决脏数据问题(线程同步),对于进程来说,解决通信问题(IPC) 三.创建线程 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能:创建线程 thread:返回值,获取线程id attr:参数,设置线程属性 start_routine:参数,线程的入口函数 arg

BSD库函数手册翻译之pthread_join函数

有些话、适合烂在心里 提交于 2019-12-17 04:32:36
名称 pthread_join -- 等待线程结束 概要 #include <pthread.h> int pthread_join(pthread_t thread,void **value_ptr); 描述 除非目标线程已经终止,否则函数pthread_join()会 暂停调用线程 的 执行 ,直到 目标线程终止 为止。 当传入一个非NULL的参数value_ptr 来调用函数pthread_join() 并成功返回时,正在终止的线程传给函数pthread_exit() 的值被储存在由 value_ptr 所引用的位置。当函数pthread_join() 成功返回时,目标线程已经被终止了。对同一个目标线程同时多次调用函数pthread_join() 的结果是未定义的。若 调用函数pthread_join()的线程被取消 ,则 目标线程未被分离 。 返回值 若执行成功,则函数 pthread_join()将返回零。否则,将返回一个错误码来指示错误。 错误 函数pthread_join()在以下情形下会失败: [EINVAL] 实现已经检测到由线程指定的值没有引用到可连接的线程。 [ESRCH] 没有发现对应于给定线程ID thread的线程。 [EDEADLK] 检测到死锁或参数thread的值指定的是调用函数pthread_join()的线程。 另请参阅: wait(2),

2019-2020-1 20175314 《信息安全系统设计基础》第8周学习总结

試著忘記壹切 提交于 2019-12-04 18:26:39
2019-2020-1 20175314 《信息安全系统设计基础》第8周学习总结 本周学习内容总结 一、线程概念 Linux下的进程,控制着一个函数的执行代码的一个执行流。 二、线程与进程的区别 线程强调的是资源共享,因为与主线程共享PCB;进程强调的是独立性,因为每个独立的进程有各自独立的PCB。 创建一个线程的开销要比创建进程的开销要小。 多线程程序,只要有一个线程出现异常,其他线程都会被"诛连",导致程序异常出错。多进程程序,各进程之间独立,不会彼此影响。 三、线程控制 因为线程不属于系统调用,因此需要用到pthread.h库 1.创建线程 #include <pthread.h> int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *),void *arg); //thread:线程id,返回型参数 //attr:线程属性 //start_routine:所要执行的的函数(返回值void*,参数为void*) //arg:函数的参数 2.终止线程 有三种方法可以终止一个线程: a.通过 return 返回,对主线程不适用。 b.一个线程可以调用 pthread_cancel 终止其它线程。 c.调用pthread_exit终止自己。 void

Is pthread_join a must when using pthread in linux?

匿名 (未验证) 提交于 2019-12-03 01:45:01
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 由 翻译 强力驱动 问题: I an learning pthread and I have a few questions. Here is my code: #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #define NUM_THREADS 10 using namespace std ; void * PrintHello ( void * threadid ) { int * tid ; tid = ( int *) threadid ; for ( int i = 0 ; i < 5 ; i ++){ printf ( "Hello, World (thread %d)\n" , * tid ); } pthread_exit ( NULL ); } int main ( int argc , char * argv []) { pthread_t threads [ NUM_THREADS ]; int rc ; int t ; int * valPt [ NUM_THREADS ]; for ( t = 0 ; t < NUM_THREADS ; t ++)

操作系统实验――矩阵乘法

匿名 (未验证) 提交于 2019-12-03 00:29:01
在windows操作系统上,利用Windows API编写程序用多线程实现矩阵乘法。实现A、B两个矩阵的乘法,并输出计算结果。 该实验相对比较简单,可先看实验报告的实验步骤,然后需要了解一下几个关于pthread里的函数使用: (1)pthread_join函数: 函数pthread_join用来等待一个线程的结束。 函数定义: int pthread_join(pthread_t thread, void **retval); 描述 : pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。 参数 : thread: 线程标识符,即线程ID,标识唯一线程。 retval: 用户定义的指针,用来存储被等待线程的返回值。 返回值 : 0代表成功。 失败,返回的则是错误号。 看下面一段程序: #include <pthread.h> #include <unistd.h> #include <stdio.h> void *thread (void *str ) { int i; for (i = 0 ; i < 10 ; ++i) { sleep ( 2 ); printf ( "This in the thread : %d \n"

c语言thread用法记录。

对着背影说爱祢 提交于 2019-12-01 04:56:10
显示c++11之前的 1.最基础,进程同时创建5个线程,各自调用同一个函数 #include <iostream> #include <pthread.h> //多线程相关操作头文件,可移植众多平台 using namespace std; #define NUM_THREADS 5 //线程数 void* say_hello( void* args ) { cout << "hello..." << endl; } //函数返回的是函数指针,便于后面作为参数 int main() { pthread_t tids[NUM_THREADS]; //线程id for( int i = 0; i < NUM_THREADS; ++i ) { int ret = pthread_create( &tids[i], NULL, say_hello, NULL ); //参数:创建的线程id,线程参数,线程运行函数的起始地址,运行函数的参数 if( ret != 0 ) //创建线程成功返回0 { cout << "pthread_create error:error_code=" << ret << endl; } } pthread_exit( NULL ); //等待各个线程退出后,进程才结束,否则进程强制结束,线程处于未终止的状态 } 输入命令:g++ -o muti_thread

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"

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)两种:   