Pthread定义

POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。


数据类型

pthread_t:线程ID
pthread_attr_t:线程属性

操纵函数

pthread_create():创建一个线程
pthread_exit():终止当前线程
pthread_cancel():中断另外一个线程的运行
pthread_join():阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init():初始化线程的属性
pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
pthread_attr_getdetachstate():获取脱离状态的属性
pthread_attr_destroy():删除线程的属性
pthread_kill():向 线程发送一个信号

同步函数

用于 mutex 和条件变量
pthread_mutex_init() 初始化 互斥锁
pthread_mutex_destroy() 删除互斥锁
pthread_mutex_lock():占有互斥锁(阻塞操作)
pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
pthread_mutex_unlock(): 释放互斥锁
pthread_cond_destroy():销毁条件变量
pthread_cond_signal(): 唤醒第一个调用 pthread_cond_wait()而进入睡眠的线程
pthread_cond_wait(): 等待条件变量的特殊条件发生
Thread-local storage(或者以Pthreads术语,称作 线程特有数据):
pthread_key_create(): 分配用于标识进程中线程特定数据的键
pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
pthread_key_delete(): 销毁现有线程特定数据键
pthread_attr_getschedparam();获取线程优先级
pthread_attr_setschedparam();设置线程优先级

工具函数


pthread_equal(): 对两个线程的线程标识号进行比较
pthread_detach(): 分离线程
pthread_self(): 查询线程自身线程标识号


`pthread_t thread` 定义了一个 **线程标识符(Thread Identifier)**,它是 POSIX 线程(pthread)库中用于唯一标识和管理线程的核心数据类型。以下是详细解析: --- ### **1. 本质与作用** - **类型定义**: `pthread_t` 是 `typedef` 定义的不透明数据类型(通常是整型或结构体指针,具体实现依赖操作系统)。 ```c // 典型实现(Linux中通常是unsigned long) typedef unsigned long pthread_t; ``` - **核心功能**: 用于唯一标识一个线程,类似于进程的 `pid_t`,但作用域仅限于当前进程。 --- ### **2. 关键用途** #### **(1) 线程创建与跟踪** ```c pthread_t thread; // 定义标识符 pthread_create(&thread, NULL, start_func, arg); // 创建线程并绑定标识符 ``` - 创建线程后,系统会将唯一ID写入 `thread` 变量。 #### **(2) 线程控制** ```c pthread_join(thread, NULL); // 等待线程结束 pthread_cancel(thread); // 终止线程 pthread_equal(thread1, thread2); // 比较两个线程ID是否相同 ``` #### **(3) 资源管理** ```c pthread_detach(thread); // 分离线程(线程退出后自动释放资源) ``` --- ### **3. 底层实现差异** | 操作系统 | 典型实现形式 | 备注 | |---------------|-----------------------------|-------------------------------| | Linux (glibc) | `unsigned long`(线程ID) | 可通过 `gettid()` 系统调用获取 | | FreeBSD | 结构体指针(`struct pthread*`) | 隐藏内部细节 | | Windows | 句柄(`HANDLE`) | 通过pthreads-win32库模拟 | --- ### **4. 在HTTP服务器中的实际应用** ```c pthread_t thread; // 定义线程标识符 int* client_fd = malloc(sizeof(int)); *client_fd = accept(...); // 获取客户端连接 // 创建线程处理请求 if (pthread_create(&thread, NULL, handle_client, client_fd) != 0) { perror("pthread_create"); free(client_fd); close(*client_fd); } else { pthread_detach(thread); // 分离线程(避免资源泄漏) } ``` - **为什么需要 `pthread_t`**: 即使不显式调用 `pthread_join`,也需通过标识符控制线程行为(如分离或终止)。 --- ### **5. 重要注意事项** 1. **不可移植性**: - 直接假设 `pthread_t` 是整型并进行算术运算可能导致问题(如FreeBSD的实现为指针)。 - 应使用 `pthread_equal()` 比较线程ID: ```c if (pthread_equal(thread1, thread2)) { ... } ``` 2. **生命周期管理**: - 线程终止后,其 `pthread_t` 标识符可能被系统复用。 - 分离线程(`pthread_detach`)后,标识符将无效。 3. **调试支持**: - Linux中可通过命令查看线程ID: ```bash ps -eLf | grep 程序名 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值