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)线程创建相关推荐

  1. linux创建线程未定义,Linux中未定义的对p线程_CREATE的引用

    Linux中未定义的对p线程_CREATE的引用#include #include #define NUM_THREADS     5void *PrintHello(void *threadid){ ...

  2. linux 用户创建时间,在linux中如何能得知一个用户的创建时间?

    在linux中如何能得知一个用户的创建时间? (2011-08-24 03:36:01) 标签: 杂谈 在linux中如何能得知一个用户的创建时间?如题.之前我试过id.passwd以及通过stat查 ...

  3. c语言open函数打开文件方式,Linux中C语言open函数打开或创建文件详细讲解

    Linux中C语言open函数打开或创建文件详细讲解 Linux中C语言open函数打开或创建文件详细讲解 头文件: #include #include #include 函数原型: int open ...

  4. linux线程堆分配,如何在Linux中的相同进程下为线程分配堆栈或内存

    Linux中当前的"线程"概念是 NPTL. NPTL使用 clone(),包装 sys_clone().为新的'线程'分配堆栈在用户空间(即libc)中处理,而不是在内核(即Li ...

  5. kill掉多个进程linux中的sudo,linux下批量kill进程的方法

    --kill某个用户下的所有进程(用户为test) --pkill # pkill -u test --killall # killall -u test --ps # ps -ef | grep t ...

  6. linux中显示进程,linux中怎么显示所有进程

    Linuxlinux中显示所有进程下使用PS命令结合相关参数可以查看linux当前系统下的所有进程.那么linux中怎么显示所有进程呢?接下来大家跟着学习啦小编一起来了解一下的解决方法吧. linux ...

  7. linux中ftp用户,linux中怎么添加ftp用户

    Linux下创建用户是很easy的事情了,只不过不经常去做这些操作,时间久了就容易忘记.那么linux中怎么添加ftp用户,下面跟着学习啦小编一起来了解一下吧. linux中怎么添加ftp用户 在li ...

  8. linux中544进程,Linux基础--进程管理及其基本命令

    本文主要讲解Linux中进程管理的基本命令使用方法. 1. top命令 作用: 动态显示进程状态 格式:top [options] 常用选项: -d: 后面可以接秒数,就是整个程序画面更新的秒数, 默 ...

  9. 在Linux中head命令,Linux 中 head 命令实例

    原标题:Linux 中 head 命令实例 head命令将每个文件的前10行打印到标准输出.对于多个文件,在每个文件前面加上一个给出文件名的头.如果没有文件,或者文件为-,则读取标准输入. 如何使用h ...

最新文章

  1. html自定义工具条,为Autodesk Viewer添加自定义工具条的更好方法
  2. 外圆内方与外方内圆的奇妙变换!
  3. WordPress多用途电子商务博客新闻主题betheme 21.5.6版本
  4. JDBC中的Statement和PreparedStatement的区别
  5. 禅道批量添加任务时选择对应模块功能
  6. OpenShift 4 - 解决 OpenShift 中 elasticsearch 环境的 Log4j 漏洞
  7. UCOS操作系统——系统内部任务(六)
  8. 提权学习:第三方软件提权(FlashFXP 替换文件漏洞提权)
  9. 实现简易植物大战僵尸修改器的历程(2)
  10. win10计算机入门使用教程,win10技巧大全_win10使用技巧方法教程 - 系统家园
  11. NetBIOS编程获取本机MAC地址及一个小坑
  12. 在 Linux 上使用 VirtualBox 的命令行管理界面
  13. 全球最强大脑在哪里?阿里小蜜算法团队在寻找
  14. HKEY_LOCAL_MACHINE:hardware\DeviceMap\SerialComm里找不到串口的解决办法
  15. 记录舒马赫告别F1车坛(转载)
  16. 关于graphql快速入门
  17. 2022年全球与中国烟酰胺单核苷酸(NMN)市场现状及未来发展趋势
  18. html5好看画布,10个会让你惊叹不已的HTML5画布(CANVAS)技术应用演
  19. 三维分析之开敞度分析
  20. android平板2018,安卓平板何处逢生?最值的平板 2018 iPad 上手体验

热门文章

  1. 外媒:美国政府官员建议阻止英飞凌收购赛普拉斯
  2. 马化腾卸任财付通网络小贷公司董事长、总经理
  3. 小米第一款智能手表来了 或支持安装手机App
  4. 华为屏下前置摄像头专利曝光:消灭刘海
  5. 苹果发布会日期再曝光 2019新iPhone发布会定在这一天?
  6. 董明珠解释举报奥克斯初衷:这不仅是企业间的竞争 更是道德的选择
  7. 深圳警方出手!“钱爸爸”涉嫌集资诈骗 已累计冻结2.13亿元
  8. 三星Galaxy Note 10再曝正面渲染图:居中前置摄像头更顺眼
  9. 《复联4》天价票被叫停了?电影局出手了 院线:确实收到口头通知
  10. 拼多多化身4亿人都在用的App 2018年日均订单量翻倍