C语⾔多线程编程-线程的基本函数
序⾔
实验室项⽬采⽤多线程实现,然⽽暂时只涉及到⼏个基本的线程操作函数,线程和进程的区别、线程的同步和异步机制以及线程通信等暂时都没有涉及,打算在这⾥做些总结,以备后⽤。
1 线程操作函数
1.1 线程创建函数
int pthread_create (pthread_t * restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn) (void *), void *restrict arg);
说明:创建⼀个具有指定参数的线程。
形参:
tidp 要创建的线程的线程id指针
attr 创建线程时的线程属性
start_rtn 返回值是void类型的指针函数
arg start_rtn的形参
返回值:若是成功建⽴线程返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
由restrict 修饰的指针是最初唯⼀对指针所指向的对象进⾏存取的⽅法,仅当第⼆个指针基于第⼀个时,才能对对象进⾏存取
pthread_t类型定义如下
typedef unsigned long int pthread_t
打印时要使⽤%lu或%u⽅式
1.2 等待线程结束函数
int pthread_join(pthread_t thread, void **retval);
说明:这个函数是⼀个线程阻塞的函数,调⽤它的函数将⼀直等待到被等待的线程结束为⽌,当函数返回时,被等待线程的资源被收回
形参:
thread 被等待的线程标识符
retval ⼀个⽤户定义的指针,它可以⽤来存储被等待线程的返回值
返回值:成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
1.3 线程退出函数
void pthread_exit(void *retval);
说明:终⽌调⽤它的线程并返回⼀个指向某个对象的指针
形参:
retval 函数的返回指针,只要pthread_join中的第⼆个参数retval不是NULL,这个值将被传递给retval
返回值:⽆
头⽂件:#include <pthread.h>
1.4 线程取消函数
int pthread_cancel(pthread_t thread);
说明:取消某个线程的执⾏
形参:
thread 要取消线程的标识符ID
返回值:若是成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
其他说明:⼀个线程能够被取消并终⽌执⾏需要满⾜两个条件(1) 线程是否可以被取消,默认可以被取消;(2) 线程处于可取消点才能取消,可以设置线程为⽴即取消或只能在取消点被取消。
1.5 设置可取消状态函数
int pthread_setcancelstate (int state, int *oldstate);
说明:设置当前线程的可取消性状态
形参:
state 要更新的⼼状态值
oldstate 原来存储的状态
state的合法值:
PTHREAD_CANCEL_DISABLE 针对⽬标线程的取消请求将处于未决状态,请求未处理但仍然存在,除⾮该线程修改⾃⼰的状态,否则不会被取消
PTHREAD_CANCEL_ENABLE 针对⽬标线程的取消请求将被传递,此状态为创建线程时的默认状态
返回值:成功返回0,否则返回错误编号以指明错误
1.6 设置取消类型函数
int pthread_setcanceltype (int type, int *oldtype);
说明:设置当前线程的取消类型,即设置在接收到取消操作后是⽴即终⽌还是在取消点终⽌
形参:
type 为调⽤线程新的可取消性
oldtype 存储原来的类型
type的合法值如下:
PTHREAD_CANCEL_ASYNCHRONOUS 可随时执⾏新的或未决的取消请求
PTHREAD_CANCEL_DEFERRED ⽬标线程到达⼀个取消点之前,取消请求将⼀直处于未决状态;此类型为创建线程时的默认类型
返回值:成功返回0,否则返回错误编号以指明错误
1.7 获取当前线程ID函数
pthread_t pthread_self (void);
说明:获取当前调⽤线程的 thread identifier(标识号)
形参:⽆
返回值:当前线程的线程ID标识
头⽂件:#include <pthread.h>
1.8 分离释放线程函数
int pthread_detach (pthread_t thread);
说明:线程资源释放⽅式设置函数
形参:
thread 要释放线程的标识符ID
返回值:若是成功返回0,否则返回错误的编号
c语言指针实验总结头⽂件:#include <pthread.h>
其他说明:linux线程执⾏和windows不同,pthread有两种状态joinable状态和unjoinable状态。
⼀个线程默认的状态是joinable,如果线程是joinable状态,当线程函数⾃⼰返回退出时或pthread_exit时都不会释放线程所占⽤堆栈和线程描述符(总计8K多),只有当你调⽤了pthread_join之后这些资源才会被释放。
若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时⾃动会被释放。
unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach⾃⼰设置, 如:
pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。如果线程状态为joinable,需要在之后适时调⽤pthread_join。
1.9 ⽐较两个线程是否是同⼀线程
int pthread_equal (pthread_t thread1, pthread_t thread2);
说明:判断两个线程ID是否是同⼀个
形参:
thread1 要⽐较的线程的标识符ID1
thread2 要⽐较的线程的标识符ID2
返回值:不相等返回0,相等⾮零
头⽂件:#include <pthread.h>
1.10 线程私有数据操作函数
创建线程私有数据
int pthread_key_create (pthread_key_t *key, void (*destr_function) (void *));
说明:创建线程私有数据TSD,提供线程私有的全局变量。使⽤同名⽽不同内存地址的线程私有数据结构
形参:
key 线程私有数据
第⼆个参数如果第⼆个参数不为空,在线程退出时将以key所关联数据为参数调⽤其指向的资源释放函数,以释放分配的缓冲区
其他说明:不论哪个线程调⽤pthread_key_create()函数,所创建的key都是所有线程可访问的,但各个线程可根据⾃⼰的需要往key中填⼊不同的值
相当于提供了同名不同值的全局变量,各线程对⾃⼰私有数据操作互相不影响
注销线程私有数据
int pthread_key_delete (pthread_key_t *key);
该函数并不检查当前是否有线程正是⽤该TSD,也不会调⽤清理函数(destr_function)
将TSD释放以供下⼀次调⽤pthread_key_create()使⽤
读写线程私有数据
写 int pthread_setspecific (pthread_key_t key, const void *pointer);
读 void pthread_getspecific (pthread_key_t key);
函数pthread_setspecific()将pointer的值(⾮内容)与key相关联
函数pthread_getspecific()将与key相关联的数据读出来
所有数据都设置为void *,因此可以指向任何类型的数据
2. 线程属性函数
属性对象是不透明的,⽽且不能通过赋值直接进⾏修改。系统提供了⼀组函数,⽤于初始化、配置和销毁线程属性。
2.1 初始化⼀个线程对象的属性
int pthread_attr_init (pthread_attr_t *attr);
说明:pthread_attr_init实现时为属性对象分配了动态内存空间
Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈⼤⼩、优先级
形参:
attr 指向⼀个线程属性的指针
返回值:若是成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
2.2 销毁⼀个线程属性对象
int pthread_attr_destroy (pthread_attr_t *attr);
说明:经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调⽤,将会导致其返回错误
形参:
attr 指向⼀个线程属性的指针
返回值:若是成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
2.3 获取线程分离状态属性
int pthread_attr_getdetachstate (pthread_attr_t *attr, int *detachstate);
说明:获取线程分离状态属性;pthread_detach()分离释放线程资源函数
形参:
attr 指向⼀个线程属性的指针
detachstate 保存返回的分离状态属性
返回值:若是成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
2.4 修改线程分离状态属性
int pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate);
说明:修改线程分离状态属性;pthread_detach()分离释放线程资源函数
形参:
attr 指向⼀个线程属性的指针
detachstate 有两个取值
PTHREAD_CREATE_JOINABLE(可连接),使⽤attr创建的所有线程处于可连接状态,线程终⽌不会回收相关资源,需在其他线程调⽤pthread_detach()或pt hread_join()函数
PTHREAD_CREATE_DETACHED(分离),使⽤attr创建的所有线程处于分离状态,这类线程终⽌带有此状态的线程相关资源将被系统收回
返回值:若是成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
2.5 获取线程间的CPU亲缘性
int pthread_attr_getaffinity_np (pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset);
说明:获取线程的CPU亲缘属性
形参:
attr 指向⼀个线程属性的指针
cpusetsize 指向CPU组的缓冲区⼤⼩
cpuset 指向CPU组的指针
返回值:若是成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
2.6 设置线程的CPU亲缘性
int pthread_attr_setaffinity_np (pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);说明:通过指定cupset来设置线程的CPU亲缘性
形参:
attr 指向⼀个线程属性的指针
cpusetsize 指向CPU组的缓冲区⼤⼩
cpuset 指向CPU组的指针
返回值:若是成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
2.7 获取线程的作⽤域
int pthread_attr_getscope (pthread_attr_t *attr, int *scope);
说明:指定了作⽤域也就指定了线程与谁竞争资源
形参:
attr 指向⼀个线程属性的指针
scope 返回线程的作⽤域
返回值:若是成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
2.8 设置线程的作⽤域
int pthread_attr_setscope (pthread_attr_t *attr, int scope);
说明:指定了作⽤域也就指定了线程与谁竞争资源
形参:
attr 指向⼀个线程属性的指针
scope 线程的作⽤域,可以取如下值
PTHREAD_SCOPE_SYSTEM 与系统中所有进程中线程竞争
PTHREAD_SCOPE_PROCESS 与当前进程中的其他线程竞争
返回值:若是成功返回0,否则返回错误的编号
头⽂件:#include <pthread.h>
2.9 获取线程的栈保护区⼤⼩
int pthread_attr_getguardsize (pthread_attr_t *attr, size_t *guardsize);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论