文档章节

Linux之线程处理函数

o
 osc_wws45aot
发布于 2019/08/20 17:22
字数 883
阅读 10
收藏 0

精选30+云产品,助力企业轻松上云!>>>

Linux的线程处理函数需包含头文件:#include <pthread.h>

一、线程函数:成功则返回0,出错则返回错误编号

1 线程创建

  • int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_rtn)(void *), void *arg);

2 线程终止

  • void pthread_exit(void *rval_ptr);

3 线程等待:只能用于等待非分离线程

  • int pthread_join(pthread_t thread, void **rval_ptr);

4 线程取消

  • int pthread_cancel(pthread_t tid);

5 线程分离:使得线程终止时其资源立即被系统回收,而非分离状态则需要pthread_join来释放资源

  • int pthread_detach(pthread_t tid); 

6 获取线程ID

  • pthread_t pthread_self(void); //返回调用线程的线程ID

二、同步函数:成功则返回0,出错则返回错误编号

1 互斥量

(1)初始化和销毁

  • pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
  • int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
  • int pthread_mutex_destroy(pthread_mutex_t *mutex);

(2)加锁

  • int pthread_mutex_lock(pthread_mutex_t *mutex);
  • int pthread_mutex_trylock(pthread_mutex_t *mutex);
  • int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *tsptr);

(3)解锁

  • int pthread_mutex_unlock(pthread_mutex_t *mutex);

2 条件变量:和互斥量mutex搭配一起使用

(1)初始化和销毁

  • pthread_cond_t cond = PTHREAD_COND_INITIALIZER
  • int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
  • int pthread_cond_destroy(pthread_cond_t *cond);

(2)等待条件变量

  • int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
  • int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *tsptr);

(3)发信号

  • int pthread_cond_signal(pthread_cond_t *cond);
  • int pthread_cond_broadcast(pthread_cond_t *cond);

代码举例:

 1 //1 等待条件
 2 pthread_mutex_lock(&lock);     ------上锁
 3 while(条件不成立)
 4 {
 5     pthread_cond_wait(&cond);  ------条件不成立时挂起等待(注意是while)
 6 }
 7 进行操作......                  ------修改、操作
 8 pthread_mutex_unlock(&lock);   ------解锁
 9 
10 //2 给条件发信号
11 pthread_mutex_lock(&lock);     ------上锁
12 设置条件为真...                 ------符合条件
13 pthread_cond_signal(&cond);    ------唤醒
14 pthread_mutex_unlock(&lock);   ------解锁

注意:如果是只有一个资源且广播信号让多个线程等到条件,为防止除第一个以外的线程误以为拿到资源,所以用while循环而不是if语句

3 读写锁

(1)初始化和销毁

  • int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
  • int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

(2)加读锁

  • int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
  • int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
  • int pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock, const struct timespec *tsptr);

(3)加写锁

  • int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
  • int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
  • int pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock, const struct timespec *tsptr);

(4)解锁

  • int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

4 自旋锁

(1)初始化和销毁

  • int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
  • int pthread_spin_destroy(pthread_spinlock_t *lock);

(2)加锁

  • int pthread_spin_lock(pthread_spinlock_t *lock);
  • int pthread_spin_trylock(pthread_spinlock_t *lock)

(3)解锁

  • int pthread_spin_unlock(pthread_spinlock_t *lock);

三、线程属性函数:成功则返回0,出错则返回错误编号

1 初始化和销毁

  • int pthread_attr_init(pthread_attr_t *attr);
  • int pthead_attr_destroy(pthread_attr_t *attr);

2 分离属性---PTHREAD_CREATE_DETACHED

  • int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
  • int pthread_attr_setdetachstate(const pthread_attr_t *attr, int detachstate); 

3 栈属性

  • int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
  • int pthread_attr_setstacksize(const pthread_attr_t *attr, size_t stacksize);

四、同步属性函数

1 互斥量

(1)初始化和销毁

  • int pthread_mutexattr_init(pthread_mutexattr_t *attr);
  • int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);

(2)进程共享属性---PHTEAD_PROCESS_PRIVATE(默认值)或PTHREAD_PROCESS_SHARED

  • int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr, int *pshared);
  • int pthread_mutexattr_setpshared(const pthread_mutexattr_t *attr, int pshared);

(3)健壮属性:解决持有互斥量的进程意外终止却没有释放互斥量---PTHREAD_MUTEX_STALLED(默认值)或PTHREAD_MUTEX_ROBUST

  • int pthread_mutexattr_getrobust(const pthread_mutexattr_t *attr, int *robust);
  • int pthread_mutexattr_setrobust(const pthread_mutexattr_t *attr, int robust);
  • int pthread_mutexattr_consistent(const pthread_mutexattr_t *attr);??????

(4)类型属性---PHREAD_MUTEX_RECURSIVE

  • int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);
  • int pthread_mutexattr_settype(const pthread_mutexattr_t *attr, int type);

2 条件变量

(1)初始化和销毁

  • int pthread_condattr_init(pthread_condattr_t *attr);
  • int pthread_condattr_destroy(pthread_condattr_t *attr);

(2)进程共享属性---同互斥量mutex

  • int pthread_condattr_getpshared(pthread_condattr_t *attr, int *pshared);
  • int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared);

(3)时钟属性:控制pthead_cond_timedwait函数的超时参数采用哪个时钟---CLOCK_REALTIME或CLOCK_MONOTONIC

  • int pthread_condattr_getclock(pthread_condattr_t *attr, clockid_t *clock_id);
  • int pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id);

3 读写锁

(1)初始化和销毁

  • int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
  • int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

(2)进程共享属性---同互斥量mutex

  • int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, int *pshared);
  • int pthread_rwlockattr_setpshared(const pthread_rwlockattr_t *attr, int pshared);
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
pthread_arrt_XXXX(调度相关)

pthreadarrtXXXX: 线程属性相关: 头文件: #include <rtl_sched.h> 函数定义: 设置/得到cpu相关属性: int pthreadattrsetcpunp(pthreadattrt *attr, int cpu); int pthreadattrgetcpunp(......

barsoom
2012/11/06
189
0
Linux多线程信号处理

linux 多线程信号编程总结 linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处...

季牧云
2012/09/22
259
0
linux signal

  linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程...

手机号
2014/10/10
32
0
信号的捕捉与sigaction函数

一、内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 用户...

osc_8ik0jlpr
2018/02/27
7
0
【原创】Linux中断子系统(二)-通用框架处理

【原创】Linux中断子系统(二)-通用框架处理 背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本:4.14 ARM64处理器,Con...

osc_dihgscoq
06/07
6
0

没有更多内容

加载失败,请刷新页面

加载更多

Git本地分支和远程分支关联

转载:https://blog.csdn.net/cherishhere/article/details/52606884 转载:https://blog.zengrong.net/post/1746.html 转载:https://blog.csdn.net/xinghuowuzhao/article/details/78663526 转......

osc_ur9jjorb
21分钟前
10
0
移动应用测试方法与思路

标签(空格分隔): 浅谈移动应用测试方法与思路 在 GUI 自动化测试这个系列,我讲了很多基于浏览器的业务测试的内容,你可能会说,现在移动 App 大行其道,对移动应用测试的方法和思路才更重...

osc_avdbd8s3
23分钟前
9
0
搜索所有Git历史记录中的字符串? [重复] - Search all of Git history for a string? [duplicate]

问题: This question already has an answer here: 这个问题在这里已有答案: How to grep Git commit diffs or contents for a certain word? 如何grep Git为某个单词提交差异或内容? 8 ...

fyin1314
24分钟前
12
0
css实现圆形倒计时效果

实现思想: 1.最外层包裹内部的div1(.box) 2.内部左右两边div2(.left_box和.right_box),宽度为div1的一半,通过overflow:hidden隐藏其内部的div 3.在左右两个div2中各有一个div3(.left_item...

osc_sg74u54s
25分钟前
7
0
python语言中threading.Thread类的使用方法

1. 编程语言里面的任务和线程是很重要的一个功能。在python里面,线程的创建有两种方式,其一使用Thread类创建 # 导入Python标准库中的Thread模块 from threading import Thread # 创建一...

osc_q5urtsdm
25分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部