多线程编程1 --线程创建,退出,等待,分离

本文介绍了多线程编程的基础概念,包括线程在进程中的地位,线程的创建、终止方式,如pthread_create、pthread_exit、pthread_cancel。还探讨了线程的等待、分离及清理处理程序,强调了线程共享资源的特点以及在不同操作系统中的实现差异。
摘要由CSDN通过智能技术生成

线程的基本概念

线程是在进程内部运行的一个执行分支,它是运行在进程的地址空间中。

和进程之间的独立性不同,线程之间更强调共享性,它共享进程的地址空间,比如数据段,代码段,堆。。。以及文件描述符表。因此,无论是线程的创建,终止,切换的代价都要比进程小很多,线程之间可以直接通信而不需要向进程通信那么麻烦(共享内存,消息队列,信号量等机制),当然有优点就有缺点,由于线程强调共享性,一个进程内的所有线程是互相影响的, 一个线程崩溃会导致该进程内的所有线程都崩溃。

线程虽然强调共享性,但是也不是所有东西都共享,对于每个线程来说,它都私有自己的栈,私有自己运行上下文如寄存器,栈指针,线程id,调度优先级等等。

在操作系统课程上,我们讲,进程是资源分配的基本单位,线程是CPU调度的基本单位,确实如此,进程负责控制资源,线程之间调度能够更好的实现并发性。

在不同的平台下,对线程实现是不一样的,例如在Windows下是有着类似于PCB控制进程的TCB(线程控制块)来控制线程,而在Linux下没有真正意义上的线程,它是用进程模拟实现,所以Linux下的线程有时也叫轻量级进程(LWP),这样的好处是,增强了代码的复用性,使得线程能够复用进程的数据结构,维护性也相对好了起来。


线程的创建

我们所学习的多线程编程都是基于Linux平台的,我自己主要的参考书籍就是Unix高级环境编程(APUE),关于线程编程主要用的POSIX标准下的pthread库,在引用这个库时候,需要

#include<pthread>

//编译需要加上-lpthread
gcc -o thread thread.c -lpthread

每个线程都有线程id,假设我们叫线程id为tid,tid可以用一个pthread_t的数据类型表示,需要注意的是,pthread _t在不同的平台下实现不同,比如在Linux为无符号整型,其他为一个结构体,因此,获取tid最好用对应的函数,判断两个tid是否相等也最好用pthread库提供的接口以提供程序的移植性。

int pthread_equal(pthread_t t1, pthread_t t2); //相等返回非0,不等返回0

pthread_t pthread_self(void);//获取线程id

线程创建是用pthread_create函数实现的

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start) (void *), void *arg);
  • thread参数指向的内存单元被设置为新创建线程的tid
  • attr为线程属性,不用时可设置为NULL
  • start为函数指针,指向一个函数,新创建的线程从start函数的地址处开始运行
  • arg是配合start函数,用于向start函数传递参数,如果不需要传递参数可设置为NULL,如果有多个参数,则需要将这些参数放在一个结构体,然后传递指向结构体的指针。

需要注意的是,在一个进程刚开始运行时候,可以看作是这个进程是一个只有单线程的进程,我们可以把这个单线程看作是主线程,当使用pthread_create创建一个新线程并不保证主线程还是新线程的运行次序,也就是谁先谁后并不知道。


线程的终止

线程的终止有几种方式,比如暴力的直接终止进程(调用exit,或者发送终止信号给进程),由于线程是运行在进程的地址空间的,因此当进程终止&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值