linux多线程编程 内有函数和实例
一.什么是线程 在一个程序里的多个执行路线就叫做线程。 更准确的定义是:线程是“一个 进程内部的一个控制序列”。 典型的 unix 进程可以看成只有一个控制线程:一个进程在同一时刻只做一 件事情。 有了多个控制线程以后,在程序设计时可以把进程设计成在同一时刻能 够做不止一件事,每个线程处理各只独立的任务。 二.线程的优点 (1) 通过为每种事件类型的处理分配单独的线程,能够简化处理异步时间 的代码。 (2) 多个线程可以自动共享相同的存储地址空间和文件描述符。 (3) 有些问题可以通过将其分解从而改善整个程序的吞吐量。 (4) 交互的程序可以通过使用多线程实现相应时间的改善,多线程可以把 程序中处理用户输入输出的部分与其它部分分开。 三.线程的缺点 线程也有不足之处。 编写多线程程序需要更全面更深入的思考。 在一个多线 程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良 影响的可能性是很大的。 调试一个多线程程序也比调试一个单线程程序困难得多 四.线程的结构 线程包含了表示进程内执行环境必需的信息,其中包括进程中标识线程的 线程 ID,一组寄存器值、 调度优先级和策略、 栈、 信号屏蔽子,errno 变量以及线 程私有数据。 进程的所有信息对该进程的所有线程都是共享的,包括可执行的程 序文本,程序的全局内存和堆内存、栈以及文件描述符。 五.线程标识 就像每个进程有一个进程 ID 一样,每个线程也有一个线程 ID,进程 ID 在 整个系统中是唯一的,但线程不同,线程 ID 只在它所属的进程环境中有效。线 程 ID 用 pthread_t 数据类型来表示,实现的时候可以用一个结构来代表 pthread_t 数据类型,所以可以移植的操作系统不能把它作为整数处理。 因此必须使用函数 来对来对两个线程 ID 进行比较。 ### Linux多线程编程知识点详解 #### 一、线程的概念 线程是现代操作系统中的基本并发单位之一,尤其在Linux环境下,线程的应用极为广泛。简单来说,**线程**是在一个进程内的多个控制流或执行路径。更精确地讲,线程是“进程内部的一个控制序列”。在传统的Unix系统中,一个进程通常只有一个控制线程;而在引入多线程支持后,进程可以同时执行多个任务,每个线程负责独立的任务。 #### 二、线程的优点 多线程具有以下优点: 1. **简化异步事件处理**:通过为每种事件类型的处理分配单独的线程,可以简化异步事件的代码实现。 2. **资源共享**:多个线程可以自动共享同一个进程的存储地址空间和文件描述符,这意味着线程间的数据交换更加高效。 3. **提高程序吞吐量**:有些复杂的问题可以通过将其分解为多个子任务并行处理,从而提高整个程序的吞吐量。 4. **改善响应时间**:对于交互式应用程序而言,多线程技术可以将用户输入输出处理与程序其他部分分开,显著改善用户体验。 #### 三、线程的缺点 尽管多线程技术带来了诸多便利,但也存在一些潜在问题: 1. **增加编程难度**:编写多线程程序需要更加细致和周到的设计与思考,特别是避免竞态条件和其他同步问题。 2. **潜在的数据不一致**:由于线程之间可能共享某些资源或数据,如果不恰当地管理这些资源,则可能导致数据不一致等问题。 3. **调试难度大**:多线程程序的调试比单线程程序更为复杂,因为线程间的交互可能会导致难以复现的问题。 #### 四、线程的结构 线程包含了一系列必要的执行环境信息,如线程ID、一组寄存器值、调度优先级和策略、栈、信号屏蔽位、errno变量以及线程私有数据等。值得注意的是,进程的所有信息,例如可执行程序文本、全局内存和堆内存、栈以及文件描述符等,都对进程中的所有线程共享。 #### 五、线程标识 类似于进程ID(PID),线程也有一个唯一标识符——线程ID(TID)。不过,线程ID仅在其所属的进程环境中有效。线程ID使用`pthread_t`类型表示,通常通过结构体实现。为了跨平台兼容性,不应将`pthread_t`视为简单的整数类型,而是应当使用专门的函数来比较线程ID,例如`pthread_equal`函数。 #### 六、线程的创建与管理 线程的创建通常使用`pthread_create`函数实现。该函数原型如下: ```c int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); ``` - `tidp`:指向一个`pthread_t`类型的指针,用于存储新创建线程的ID。 - `attr`:指定线程属性,可以设为`NULL`使用默认属性。 - `start_rtn`:指向线程启动函数的指针。 - `arg`:传递给线程启动函数的参数。 示例代码如下: ```c #include <pthread.h> void printids(const char *s) { printf("%spid:%u tid:%u\n", s, getpid(), pthread_self()); } void* thr_fn(void *arg) { printids("new thread:"); return NULL; } int main() { int err; pthread_t tid; err = pthread_create(&tid, NULL, thr_fn, NULL); if (err != 0) { printf("can't create thread: %s\n", strerror(err)); return -1; } printids("main thread:"); sleep(1); return 0; } ``` 编译命令:`cc -lpthread -o gettid gettid.c` #### 七、线程管理函数 - **pthread_equal**:比较两个线程ID是否相同。 ```c int pthread_equal(pthread_t tid1, pthread_t tid2); ``` - **pthread_self**:获取当前线程的ID。 ```c pthread_t pthread_self(void); ``` #### 总结 本文详细介绍了Linux环境下多线程编程的基础概念和技术要点,包括线程的定义、优缺点、线程结构与标识、线程创建及管理等关键知识点。通过对这些核心概念的理解和掌握,开发者能够在实际项目中更好地利用多线程技术提升程序性能和用户体验。
- 粉丝: 6
- 资源: 35
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 微信群助手,微信群影视机器人,微信群娱乐机器人test
- monkey-test
- 《ESP32从0到1》收官篇:wifi版温湿度蓝牙网关源码
- 算法部署-使用NCNN在树莓派上部署YOLOv6目标检测算法-优质算法部署项目实战.zip
- javaweb项目个人博客系统springboot+vue+mybatis idea运行 redis mysql数据库-java
- 中小型医院网站-java-基于springBoot中小型医院网站设计与实现(毕业论文+开题)
- 官网模板(html版 / vue版)
- 人事系统-java-基于springBoot人事系统设计与实现(毕业论文)
- Java项目: 基于springBoot+mysql+maven+vue宠物领养系统(含源码+数据库+开题+答辩PPT+毕业论文
- 卫生健康系统-java-基于springBoot智能推荐的卫生健康系统(毕业论文+开题)
- 1
- 2
前往页