linux中线程ptid,Linux 线程(1)线程创建
1. 线程
线程是一个轻量化的进程,关于进程与线程的详细概念参见:
进程与线程
线程相比与进程而言,其控制和调度更加灵活,由于同一进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
文件描述符表
每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)
当前工作目录
用户id和组id
但有些资源是每个线程各有一份的:
线程id
上下文,包括各种寄存器的值、程序计数器和栈指针
栈空间
errno变量
信号屏蔽字
调度优先级
2. 创建线程
在Linux中创建线程需要用到pthread_create函数:
#include
int pthread_create(pthread_t *restrict ptid,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
头文件:pthread.h
返回值:
成功:0
失败:errno
错误号存放在errno中
参数解析:
ptid: 线程id
attr:线程属性,本章不深入讨论线程属性
start_routine: 线程入口函数,线程启动时,自动执行此函数.注意返回值为void *。这是一个函数指针,关于函数指针参见C函数指针
当start_routine返回时,此线程结束,其它线程可以调用pthread_join得到start_routine的返回值。
arg:start_routine 的参数, 注意其类型为void*
一个简单的例子:
#include
#include
#include
#include
#include
pthread_t ntid;
void printids(const char *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid,
(unsigned int)tid, (unsigned int)tid);
}
void *thr_fn(void *arg)
{
printids(arg);
return NULL;
}
int main(void)
{
int err;
err = pthread_create(&ntid, NULL, thr_fn, "new thread: ");
if (err != 0) {
fprintf(stderr, "can't create thread: %s\n", strerror(err));
exit(1);
}
printids("main thread:");
sleep(1);
return 0;
}
函数运行结果:
$ gcc main.c -lpthread
$ ./a.out
main thread: pid 7398 tid 3084450496 (0xb7d8fac0)
new thread: pid 7398 tid 3084446608 (0xb7d8eb90)
注意:多线程编程需要用到libpthread库,所以编译时必须加上 -lpthread
pid(): 获取进程id,
pthread_self():获取线程id。
3. 终止线程
3.1 终止线程,不终止进程
(1)从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit。
(2)一个线程可以调用pthread_cancel终止同一进程中的另一个线程。
(3)线程可以调用pthread_exit终止自己。
pthread_exit
#include
void pthread_exit(void *value_ptr);
头文件:pthread.h
返回值:void
参数解析:
value_ptr是void *类型,和线程函数返回值的用法一样,其它线程可以调用pthread_join获得这个指针。
注意:pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配
pthread_jion
#include
int pthread_join(pthread_t tid, void **value_ptr);
头文件:pthread.h
返回值:
成功:0
失败:errno
参数解析: tid: 被终止的线程id
value_ptr: 终止状态。
调用该函数的线程将挂起等待,直到id为thread的线程终止。
value_ptr:
(1)tid线程通过return返回,**value_ptr=tid返回值。
(2)tid线程被别的线程调用pthread_cancel异常终止掉,**value_ptr=PTHREAD_CANCELED。
(3)tid线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。
3.2 thread detach
一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL。对一个尚未detach的线程调用pthread_join或pthread_detach都可以把该线程置为detach状态,也就是说,不能对同一线程调用两次pthread_join,或者如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。
#include
int pthread_detach(pthread_t tid);
返回值:成功返回0,失败返回错误号。
4. 参考文献
Linux C编程一站式学习
linux中线程ptid,Linux 线程(1)线程创建相关推荐
- linux创建线程未定义,Linux中未定义的对p线程_CREATE的引用
Linux中未定义的对p线程_CREATE的引用#include #include #define NUM_THREADS 5void *PrintHello(void *threadid){ ...
- linux 用户创建时间,在linux中如何能得知一个用户的创建时间?
在linux中如何能得知一个用户的创建时间? (2011-08-24 03:36:01) 标签: 杂谈 在linux中如何能得知一个用户的创建时间?如题.之前我试过id.passwd以及通过stat查 ...
- c语言open函数打开文件方式,Linux中C语言open函数打开或创建文件详细讲解
Linux中C语言open函数打开或创建文件详细讲解 Linux中C语言open函数打开或创建文件详细讲解 头文件: #include #include #include 函数原型: int open ...
- linux线程堆分配,如何在Linux中的相同进程下为线程分配堆栈或内存
Linux中当前的"线程"概念是 NPTL. NPTL使用 clone(),包装 sys_clone().为新的'线程'分配堆栈在用户空间(即libc)中处理,而不是在内核(即Li ...
- kill掉多个进程linux中的sudo,linux下批量kill进程的方法
--kill某个用户下的所有进程(用户为test) --pkill # pkill -u test --killall # killall -u test --ps # ps -ef | grep t ...
- linux中显示进程,linux中怎么显示所有进程
Linuxlinux中显示所有进程下使用PS命令结合相关参数可以查看linux当前系统下的所有进程.那么linux中怎么显示所有进程呢?接下来大家跟着学习啦小编一起来了解一下的解决方法吧. linux ...
- linux中ftp用户,linux中怎么添加ftp用户
Linux下创建用户是很easy的事情了,只不过不经常去做这些操作,时间久了就容易忘记.那么linux中怎么添加ftp用户,下面跟着学习啦小编一起来了解一下吧. linux中怎么添加ftp用户 在li ...
- linux中544进程,Linux基础--进程管理及其基本命令
本文主要讲解Linux中进程管理的基本命令使用方法. 1. top命令 作用: 动态显示进程状态 格式:top [options] 常用选项: -d: 后面可以接秒数,就是整个程序画面更新的秒数, 默 ...
- 在Linux中head命令,Linux 中 head 命令实例
原标题:Linux 中 head 命令实例 head命令将每个文件的前10行打印到标准输出.对于多个文件,在每个文件前面加上一个给出文件名的头.如果没有文件,或者文件为-,则读取标准输入. 如何使用h ...
最新文章
- html自定义工具条,为Autodesk Viewer添加自定义工具条的更好方法
- 外圆内方与外方内圆的奇妙变换!
- WordPress多用途电子商务博客新闻主题betheme 21.5.6版本
- JDBC中的Statement和PreparedStatement的区别
- 禅道批量添加任务时选择对应模块功能
- OpenShift 4 - 解决 OpenShift 中 elasticsearch 环境的 Log4j 漏洞
- UCOS操作系统——系统内部任务(六)
- 提权学习:第三方软件提权(FlashFXP 替换文件漏洞提权)
- 实现简易植物大战僵尸修改器的历程(2)
- win10计算机入门使用教程,win10技巧大全_win10使用技巧方法教程 - 系统家园
- NetBIOS编程获取本机MAC地址及一个小坑
- 在 Linux 上使用 VirtualBox 的命令行管理界面
- 全球最强大脑在哪里?阿里小蜜算法团队在寻找
- HKEY_LOCAL_MACHINE:hardware\DeviceMap\SerialComm里找不到串口的解决办法
- 记录舒马赫告别F1车坛(转载)
- 关于graphql快速入门
- 2022年全球与中国烟酰胺单核苷酸(NMN)市场现状及未来发展趋势
- html5好看画布,10个会让你惊叹不已的HTML5画布(CANVAS)技术应用演
- 三维分析之开敞度分析
- android平板2018,安卓平板何处逢生?最值的平板 2018 iPad 上手体验
热门文章
- 外媒:美国政府官员建议阻止英飞凌收购赛普拉斯
- 马化腾卸任财付通网络小贷公司董事长、总经理
- 小米第一款智能手表来了 或支持安装手机App
- 华为屏下前置摄像头专利曝光:消灭刘海
- 苹果发布会日期再曝光 2019新iPhone发布会定在这一天?
- 董明珠解释举报奥克斯初衷:这不仅是企业间的竞争 更是道德的选择
- 深圳警方出手!“钱爸爸”涉嫌集资诈骗 已累计冻结2.13亿元
- 三星Galaxy Note 10再曝正面渲染图:居中前置摄像头更顺眼
- 《复联4》天价票被叫停了?电影局出手了 院线:确实收到口头通知
- 拼多多化身4亿人都在用的App 2018年日均订单量翻倍