linux线程篇 (二) 线程的基本操作
| 线程 | 进程 | |
| 标识符 | pthread_t | pid_t |
| 获取ID | pthread_self() | getpid() |
| 创建 | pthread_create() | fork |
| 销毁 | pthread_exit() | exit() |
| 等待 | pthread_join() | wait() |
| 取消 | pthread_cancel() | |
| 信号发送 | pthread_kill() | kill() raise() alarm() |
| 信号处理 | signal | signal |
| 信号屏蔽 | pthread_sigmask() | |
| 线程清除 | pthread_cleanup_push/pop |
1.线程的创建
#include <pthread.h> pthread_t pthread_self(void); //返回自己的线程id int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg); //pthread_t *thread 新线程的id指针,注意是指针, pthread_t ntid; 这里就是 &tid
//const pthread_attr_t *attr, 新线程属性,这里暂为NULL
//void *(*start_routine) (void *), 新线程的函数入口
/*
* 描述:这是一个函数指针作为入口函数
* 参数:void * 指针类型
* 返回值为 void*
* (*start_routine) 这是一个指针变量,它指向一个函数,
因此在实参里本应该是&thread_fun
但是因为 函数名编译后,本身就是指针,所以可以隐去&
*/ //实例:pthread_creat(&ntid,NULL,&thread_fun,"我是给thread_fun的参数");
// void *thread_fun(void *arg){} void pthread_exit(void *value_ptr);
2.线程的终止
单个线程的安全退出 ()
() 从启动线程中返回,返回值时线程的退出码
() 线程可以被同一进程中的其他线程取消
() 线程调用pthread_exit(void *rval),rval 是退出码 void pthread_exit(void *value_ptr);
3.线程的链接
#include <pthread.h> int pthread_join(pthread_t thread, void **value_ptr);
//该函数的线程会一直阻塞,直到 第一个参数的线程退出后,继续运行,第一个参数的线程退出码会被保存到第二个参数里,
//return 成功0 失败错误吗 //调用pthread_join 会让指定的线程处于分离状态,如果该线程已经是分离状态,那就会调用失败。 //
int pthread_detach(pthread_t thread); //线程分离,可以分离自己
4.线程取消
//取消线程
int pthread_cancel(pthread_t thread); //取消状态
int pthread_setcancelstate(int state, int *oldstate);
//PTHREAD_CANCEL_ENABLE 允许取消
//PTHREAD_CANCEL_DISABLE 不允许取消 //取消类型
int pthread_setcanceltype(int type, int *oldtype);
//PTHREAD_CANCEL_DEFERRED 延迟取消
//PTHREAD_CANCEL_ASYNCHRONOUS 立即取消 //取消点 如果是延时取消,那么在每一个取消点都会检查是否取消
5.线程信号
//1.信号的发送
int pthread_kill(pthread_t thread, int sig); //向线程发送信号 //return
// [ESRCH] thread is an invalid thread ID.
// [EINVAL] sig is an invalid or unsupported signal number.
//[ENOTSUP] thread was not created by pthread_create() and does not support being killed with
pthread_kill() //信号的大部分操作是终止进程,所以要对信号作出正确的处理。
//2.信号的处理
int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact); struct sigaction {
union __sigaction_u __sigaction_u; /* signal handler */
sigset_t sa_mask; /* signal mask to apply */
int sa_flags; /* see signal options below */
}; union __sigaction_u {
void (*__sa_handler)(int);
void (*__sa_sigaction)(int, siginfo_t *,
void *);
};
//3.信号的屏蔽
int pthread_sigmask(int how, const sigset_t * restrict set, sigset_t * restrict oset);
6.进程的清除
//线程可以注册多个清理程序,入栈的形式 ,所以执行顺序和注册顺序相反 //注册清理程序
void pthread_cleanup_push(void (*cleanup_routine)(void *), void *arg); //销毁清理程序
void pthread_cleanup_pop(int execute); //响应方式
//1.pthreat_exit
//2.pthread_cancel
//3.调用 void pthread_cleanup_pop(int execute); 非零参数
linux线程篇 (二) 线程的基本操作的更多相关文章
- C#线程篇---解答线程之惑(2)
我们都知道,在这个行业,追求的就是用最少的时间学最多的知识,这是我写这个系列最想达到的目标,在最快的时间内,帮助更多的人学习更多的线程知识. 前一篇,讲述了线程基础,给大家铺垫了一个基础,这一篇着重介 ...
- linux c编程:线程互斥二 线程死锁
死锁就是不同的程序在运行时因为某种原因发生了阻塞,进而导致程序不能正常运行.阻塞程序的原因通常都是由于程序没有正确使用临界资源. 我们举个日常生活中的例子来比喻死锁.我们把马路上行驶的汽车比作运行着的 ...
- linux线程篇 (三) 线程的同步
1 互斥量 pthreat_mutex_t mymutex; //1. 创建 初始化 int pthread_mutex_init(pthread_mutex_t *mutex, const pthr ...
- linux线程篇 (一) 线程的基本概念
--进程 一个正在执行的程序,资源分配的最小单位 进程中的事情需要按照一定顺序区执行的,但是如何在一个进程中让一些事情同时发生呢?子进程存在缺陷 --引进多线程 --线程:有时又称轻量级进程,程序执行 ...
- linux进程篇 (二) 进程的基本控制
2. 进程的基本操作 接口函数 #include <unistd.h> //创建子进程 pid_t fork(void); //结束子进程 void exit(int status); / ...
- 从零开始学Linux系统(二)之基本操作指令
ifconfigping ip地址帮助:ping -t ip地址ping -c 次数 ip地址ping -s 包的大小关机重启:shutdown -h now reboot清屏:clear == C ...
- Linux基础篇二:Bash shell(壳,命令解释器)介绍
shell执行方式: 第一:输入命令 (简单工作) 第二: 脚本 (适合大量工作) Bash shell 实际上的叫法是 GNU/Bash 如何查询呢: bash - version ...
- 【转】C#线程篇
C# 温故而知新: 线程篇(一) C# 温故而知新: 线程篇(二) C# 温故而知新:线程篇(三) C# 温故而知新: 线程篇(四)
- 羽夏看Win系统内核——进程线程篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
随机推荐
- PHP-Gealman
一.简介 Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务.php官方收录:http://php.net/manu ...
- Oracle修改表名的几种方式
因为原来所在表不想被删除,但又需要新建立一个相同表名的表,故先把原来的表的表名更改为另一个临时表名. 查看当前用户下所有的表 select tname from tab where tabtype= ...
- Hadoop学习---Hadoop的深入学习
Hadoop生态圈 存储数据HDFS(Hadoop Distributed File System),运行在通用硬件上的分布式文件系统.具有高度容错性.高吞吐量的的特点. 处理数据MapReduce, ...
- 404错误 标签: servlet浏览器 2016-11-16 16:58 61人阅读 评论(0) 收藏
404是资源没有找到,一般由于以下几个方面导致: 1.路径出错: a)检查web.xml中servlet的配置是否出错 b)浏览器访问是路径书写方式:http://localhost:8080/项目名 ...
- js笔记 标签: javascript 2016-08-01 13:30 75人阅读 评论(0) 收藏
typeof可以用来检测给定变量的数据类型,typeof是一个操作符而不是函数,所以圆括号可以省略. Undefined类型只有一个值,即特殊的undefined.在使用var声明变量但未对其加以初始 ...
- 第二周 day2 python学习笔记
1. python中的三元运算: result=value1 if 条件 else value2 如果条件成立,result=value1 如果条件不成立,result=value2 2. pytho ...
- SAP CRM One Order跟踪和日志工具CRMD_TRACE_SET
事务码CRMD_TRACE_SET激活跟踪模式: 在跟踪模式下运行One Order场景.运行完毕后,使用事务码CRMD_TRACE_EVAL: 双击参数,就能看到参数明细: 点Callstack也能 ...
- codeforces 792C. Divide by Three
题目链接:codeforces 792C. Divide by Three 今天队友翻了个大神的代码来问,我又想了遍这题,感觉很好,这代码除了有点长,思路还是清晰易懂,我就加点注释存一下...分类吧. ...
- 关于mvvm:UI、数据、绑定、状态、中间变量、数据适配、数据处理
绑定: UI控件 --> VM VM -> UI控件 关于mvvm:UI.数据.绑定.状态.中间变量.数据适配.数据处理: https://github.com/zzf073/Log ...
- 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构
015-08-09 杨尚刚 高可用架构 此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美 ...