索引:
1.创建线程pthread_create
2.等待线程结束pthread_join
3.分离线程pthread_detach
4.创建线程键pthread_key_create
5.删除线程键pthread_key_delete
6.设置线程数据pthread_setspecific
7.获取线程数据pthread_getspecific
8.获取线程标示符pthread_self
9.比较线程pthread_equal
10.一次执行pthread_once
11.出让执行权sched_yield
12.修改优先级pthread_setschedparam
13.获取优先级pthread_getschedparam
14.发送信号pthread_kill
15.设置线程掩码pthread_sigmask
16.终止线程pthread_exit
17.退出线程pthread_cancel
18.允许/禁止退出线程pthread_setcancelstate
19.设置退出类型pthread_setcanceltype
20.创建退出点pthread_testcancel
21.压入善后处理函数
22.弹出善后处理函数

--------------------------------------------------------------------------------

1.创建线程pthread_create
#include
int pthread_create(pthread_t *tid, const pthread_attr_t *tattr, void *(*start_routine)(void *), void *arg);
返回值:函数成功返回0。任何其他返回值都表示错误。

创建一个线程。

参数tattr中含有初始化线程所需要的属性,start_routine是线程入口函数的地址,当start_routine返回时,相应的线程就结束了。

当函数成功时,线程标示符保存在参数tid指向的内存中。

如果不指定属性对象,将其置为NULL,则创建一个缺省的线程,有如下属性:

非绑定的;
未分离的;
由一个缺省大小的堆栈;
具有和父线程一样的优先级。
注意:在创建子线程时,传给子线程的输入参数最好是由malloc()函数返回的指针或指向全局变量的指针,而不要是指向局部变量的指针。要保证子线程处理参数时,该区域仍然有效。

--------------------------------------------------------------------------------
2.等待线程结束pthread_join
#include
int pthread_join(pthread_t tid, void **status);
返回值:函数成功返回0。任何其他返回值都表示错误。

等待一个线程结束。

该函数阻塞调用它线程,直到参数tid指定的线程结束。

tid指定的线程必须在当前进程中,同时tid指定的线程必须是非分离的。

不能有多个线程等待同一个线程终止。如果出现这种情况,一个线程将成功返回,别的线程将返回错误ESRCH。

如果参数status不为NULL,则将线程的退出状态放在status指向的内存中。

--------------------------------------------------------------------------------
3.分离线程pthread_detach
#include
int pthread_detach(pthread_t tid);
返回值:函数成功返回0。任何其他返回值都表示错误。

将非分离的线程设置为分离线程。即通知线程库在指定的线程终止时回收线程占用的内存等资源。

在一个线程上使用多次pthread_detach的结果是不可预见的。

--------------------------------------------------------------------------------
4.创建线程键pthread_key_create
#include
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
返回值:函数成功返回0。任何其他返回值都表示错误。

在进程中分配一个键值,这个键被用来表示一个线程数据项。这个键对进程中所有的线程都是可见的。刚创建线程数据键时,在所有线程中和这个键相关联的值都是NULL。

函数成功返回后,分配的键放在key参数指向的内存中,必须保证key参数指向的内存区的有效性。

如果指定了解析函数destructor,那么当线程结束时并且将非空的值绑定在这个键上,系统将调用destructor函数,参数就是相关线程与这个键绑定的值。绑定在这个键上的内存块可由destructor函数释放。

--------------------------------------------------------------------------------
5.删除线程键pthread_key_delete
#include
int pthread_key_delete(pthread_key_t key);
返回值:函数成功返回0。任何其他返回值都表示错误。

删除线程数据键。这个键占用的内存将被释放,该键再被引用将返回错误。

在调用该函数之前,程序必须释放和本线程相关联的资源,该函数不会引发线程数据键的解析函数。

--------------------------------------------------------------------------------
6.设置线程数据pthread_setspecific
#include
int pthread_setspecific(pthread_key_t key, const void *value);
返回值:函数成功返回0。任何其他返回值都表示错误。

设置和某个线程数据键绑定在一起的线程专用数据(一般是指针)。

函数不会释放原来绑定在键上的内存,给一个键值绑定新的指针时,必须释放原指针指向的内存,否则会发生内存泄漏。

--------------------------------------------------------------------------------
7.获取线程数据pthread_getspecific
#include
void pthread_getspecific(pthread_key_t key, void **value);
无返回值。出错时value指向NULL。

获取绑定在线程数据键上的值,并在指定的位置存储取来的值。

--------------------------------------------------------------------------------
8.获取线程标示符pthread_self
#include
pthread_t pthread_self(void);

返回当前线程的标示符。

--------------------------------------------------------------------------------
9.比较线程pthread_equal
#include
int pthread_equal(pthread_t tid1, pthread_t tid2);
如果tid1和tid2相同,函数返回一个非0值,否则返回0。

如果tid1或tid2中任何一个是非法值,则返回将是不可预料的。

--------------------------------------------------------------------------------
10.一次执行pthread_once
#include
int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
返回值:函数成功返回0。任何其他返回值都表示错误。

函数用来调用初始化函数。如果已经有线程通过pthread_once调用过这个初始化函数一次,那么以后通过pthread_once函数再调用这个初始化函数将无效。

参数once_control决定了相应的初始化函数是否被调用过。它一般如下使用:
[static] pthread_once_t once_control = PTHREAD_ONCE_INIT。

--------------------------------------------------------------------------------
11.出让执行权sched_yield
#include
int sched_yield(void);
返回值:函数成功返回0。-1表示错误。

把当前线程的执行权(即对处理器的控制权)出让给另一个有相同或更高优先级的线程。

--------------------------------------------------------------------------------
12.修改优先级pthread_setschedparam
#include
int pthread_setschedparam(pthread_t tid, int policy, const struct sched_param *param);
返回值:函数成功返回0。任何其他返回值都表示错误。

修改线程的优先权。

--------------------------------------------------------------------------------
13.获取优先级pthread_getschedparam
#include
int pthread_getschedparam(pthread_t tid, int policy, struct schedparam *param);
返回值:函数成功返回0。任何其他返回值都表示错误。

获取线程的优先级。

--------------------------------------------------------------------------------
14.发送信号pthread_kill
#include
int pthread_kill(pthread_t tid, int sig);
返回值:函数成功返回0。任何其他返回值都表示错误。

向tid指定的线程发送一个信号,tid指定的线程必须和当前线程在同一个进程中。

当sig参数为0时,函数将进行错误检查,不发送信号,这常常用来检查tid的合法性。

--------------------------------------------------------------------------------
15.设置线程掩码pthread_sigmask
#include
#include
int pthread_sigmask(int how, const sigset_t *new, sigset_t *old);
返回值:函数成功返回0。任何其他返回值都表示错误。

改变或检验当前线程的信号掩码。

参数how表示对当前信号掩码进行什么操作,有如下值:SIG_BLOCK、SIG_UNBLOCK、SIG_SETMASK。

当参数new为NULL时,不论how的值是什么,当前线程的信号掩码都不会改变。

旧的信号掩码保存在参数old指向的内存中,当old不为NULL时。

--------------------------------------------------------------------------------
16.终止线程pthread_exit
#include
void pthread_exit(void *status);

终止当前线程,所有绑定在线程数据键上的内存将被释放。如果当前线程是非分离的,那么这个线程的标示符合退出代码将被保留,直到其他线程用pthread_join来等待当前线程的终止。如果当前线程是分离的,status将被忽略,线程标示符将被立即回收。

若status不为NULL,线程的退出代码被置为status参数指向的值。

--------------------------------------------------------------------------------
17.退出线程pthread_cancel
#include
int pthread_cancel(pthread_t thread);
返回值:函数成功返回0。任何其他返回值都表示错误。

退出一个线程。如何响应退出请求取决于目标线程的状态。

--------------------------------------------------------------------------------
18.允许/禁止退出线程pthread_setcancelstate
#include
int pthread_setcancelstate(int state, int *oldstate);
返回值:函数成功返回0。任何其他返回值都表示错误。

参数state取值为PTHREAD_CANCEL_ENABLE或PTHREAD_CANCEL_DISABLE。

--------------------------------------------------------------------------------
19.设置退出类型pthread_setcanceltype
#include
int pthread_setcanceltype(int type, int *oldtype);
返回值:函数成功返回0。任何其他返回值都表示错误。

将线程退出类型设置为延迟类型或异步类型。参数type的取值为PTHREAD_CANCEL_DEFERRED或PTHREAD_CANCEL_ASYNCHRONOUS。

当一个线程被创建后,缺省值是延迟类型。在异步方式下,线程可以在执行的任何时候被退出。

--------------------------------------------------------------------------------
20.创建退出点pthread_testcancel
#include
void pthread_testcancel(void);
无返回值。

设置线程的退出点。

只有当线程的退出状态是允许退出的,而且线程的退出类型是延迟时,调用该函数才有效。如果调用时线程的退出状态是禁止的,则该调用不起作用。

小心使用该函数,只有在能够安全的被退出的地方才能够设置退出点。

--------------------------------------------------------------------------------
21.压入善后处理函数
#include
void pthread_cleanup_push(void (*routine)(void *), void *args);

将一个善后处理函数压入善后处理函数堆栈。

--------------------------------------------------------------------------------
22.弹出善后处理函数
#include
void pthread_cleanup_pop(int execute);

从善后处理函数堆栈中弹出一个善后处理函数。如果参数execute非0,则执行弹出的函数;如果参数为0,则不执行弹出函数。

如果一个线程显式或隐式的调用pthread_exit()函数或线程接受了退出请求,线程库实际上将会以非0参数调用pthread_cleanup_pop函数。

转自:http://blog.chinaunix.net/space.php?uid=13760159&do=blog&cuid=1225657

线程基本编程——线程函数大全相关推荐

  1. linux线程函数大全

    以下内容来源于网络,本人仅收集用于学习之用,如原作者有任何意见,可以给我留言,我会尽快将其删除. 索引: 1.创建线程pthread_create 2.等待线程结束pthread_join 3.分离线 ...

  2. Linux多线程编程-线程函数返回值(返回简单数据类型)

    引言 通过几个实验练习,学习线程之间连接的具体实现.下面列举了两个例子,一个是子线程返回简单数据类型:另一个是子线程返回复杂数据类型. 实现代码 子线程返回简单的数据类型 #include<st ...

  3. 线程安全之strtok()函数

    先来看下线程安全的概念: 线程安全是多线程编程时的计算机程序代码中的一个概念.在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染 ...

  4. Linux系统编程——线程私有数据

    在多线程程序中.常常要用全局变量来实现多个函数间的数据共享.因为数据空间是共享的,因此全局变量也为全部线程共同拥有. 測试代码例如以下: #include <stdio.h> #inclu ...

  5. gj11 多线程、多进程和线程池编程

    11.1 python中的GIL # coding=utf-8 # gil global interpreter lock (cpython) # python中一个线程对应于c语言中的一个线程 # ...

  6. Linux编程---线程

    首先说一下线程的概念.事实上就是运行在进程的上下文环境中的一个运行流.普通进程仅仅有一条运行流,可是线程提供了多种运行的路径并行的局面. 同一时候,线程还分为核心级线程和用户级线程.主要差别在属于核内 ...

  7. C++并发编程线程间共享数据std::future和sd::promise

    线程间共享数据 使用互斥锁实现线程间共享数据 为了避免死锁可以考虑std::lock()或者boost::shared_mutex 要尽量保护更少的数据 同步并发操作 C++标准库提供了一些工具 可以 ...

  8. Linux C :线程操作和线程同步的多线程并发编程

    在这之前可以先看看这边文章了解线程概念,信号量,条件变量,死锁.管程等概念 https://blog.csdn.net/superSmart_Dong/article/details/11666837 ...

  9. python 线程同步_Python并发编程-线程同步(线程安全)

    Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...

最新文章

  1. 奥城大学计算机专业,美国研究生院,双录取的学校有哪些?都有什么专业?
  2. CMD中使用attrib命令设置文件只读、隐藏属性详解
  3. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫
  4. Anaconda安装tenserflow
  5. 卡巴斯基安全浏览器_360安全DNS正式推出DoH安全解析服务,打造安全上网“金钟罩”...
  6. php二维数组排序 按照指定的key 对数组进行排序
  7. BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】
  8. spring入门到放弃——spring事务管理
  9. java向上和向下的区别_Java的向上和向下转型
  10. echarts 地图 给每个区域设置定位点图标及散点
  11. struct termios 结构体详解
  12. 安装磁盘阵列卡的方法
  13. LeetCode(数据库)- 2142. The Number of Passengers in Each Bus I
  14. MySQL服务器地址为空,win10 mysql没有服务器地址
  15. Win10禁用管理员帐户后无法进入的两种解决方法
  16. android一键清理任务,Android 一键清理、内存清理功能实现
  17. 最小公倍数C语言怎么算,算法:最大公约数和最小公倍数(C语言表示)
  18. java无法验证发布者_Win10弹出无法验证发布者怎么解决?
  19. 【脑电数据处理】electrophysiology and EEG(AP\LFP\ECoG\EEG)
  20. 最新版HBuilderx + 夜神模拟器 模拟器调试设置

热门文章

  1. aspx网页背景图片设置代码_python requests,BeautifulSoup批量下载360图片
  2. JAVA之获取JavaSwing复选框JCheckBox选中的值(内容)
  3. [转帖]Ubuntu 对应内核版本
  4. shell脚本实例-判断主机存活 以及企业备份方案
  5. 使用Amazon Simple Queue Service(SQS) 实现简单的消息服务
  6. 1. Spring boot 之热部署
  7. 异步提交表单插件jquery.form.min.js的使用实例
  8. java io内存泄露_java内存泄露和OutOfMemory
  9. [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
  10. [Python图像识别] 四十六.图像预处理之图像去雾详解(ACE算法和暗通道先验去雾算法)