请关注pthread_setconcurrency()

本文介绍了pthread_setconcurrency()函数的重要性及其使用方法。该函数用于指定进程中的并发线程数,有助于提高系统调度效率和程序的移植性。忽略此函数可能导致部分线程无法运行。
     最近在code review一些人的代码的时候,发现了一个问题,就是很少人关注pthread_setconcurrency()函数,其实这个函数在pthread中是一个很重要的函数。在linux下,如果你忽略了这个函数的使用,那么能够并发的线程数目由实现者来控制,对于系统调度的效率而言往往不是什么好的事情,因为默认的设置往往不是最佳的。
     更为糟糕的是,如果在某些系统中,如果你不调用pthread_setconcurrency()函数,那么系统中的运行的线程仅仅是第一个被创建的线程,其他线程根本不会被运行 。比如在solaris 2。6中就有这些情况。为了在unix或者是linux系统上使移植更加的容易,请不要忘记在适当的地方调用次函数,清晰的告诉系统我们使用的线程个数。虽然在某些系统上,这个调用是徒劳的,但是它的使用增强的移植性!
     上面罗嗦了半天,可能网友会问,如何使用这个函数呢?请看一下次函数的定义:
int pthread_setconcurrency(int new_level);
new_level一般是当前进程中线程的使用个数,在我们的系统中,往往线程的个数是可以确定下来的,所以一般在
初始化函数中显示的设置对应的数值。
如果网友想更加详细的知道它的使用方法,请参考:
http://opengroup.org/onlinepubs/007908799/xsh/pthread_getconcurrency.html
<think> 我们被要求回答关于pthread_create、pthread_join、pthread_exit、pthread_detach的使用方法和区别。根据提供的引用,我们可以总结如下: 1. pthread_create:用于创建新线程。 2. pthread_join:用于等待指定线程结束并回收其资源(阻塞调用者)。 3. pthread_exit:用于终止当前线程,并可返回一个值。 4. pthread_detach:分离线程,使得线程结束后自动释放资源,无需其他线程调用pthread_join。 注意:一个线程不能被同时连接(join)和分离(detach),一旦分离就不能再连接(引用[3])。另外,分离线程可以在创建时设置属性,也可以在创建后调用pthread_detach。 我们将按照以下结构回答: - 分别介绍每个函数的功能、参数和返回值。 - 说明它们之间的区别和联系。 - 给出使用示例(根据引用中的代码示例)。 - 注意事项(如不能对已分离的线程调用pthread_join)。 同时,我们会生成相关问题。 </think> ### pthread_create、pthread_join、pthread_exit、pthread_detach详解 #### 1. pthread_create:线程创建 **功能**:创建新线程 **原型**: ```c int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg); ``` **参数说明**: - `thread`:输出参数,存储新线程ID - `attr`:线程属性(NULL表示默认属性) - `start_routine`:线程入口函数 - `arg`:传递给入口函数的参数 **返回值**:成功返回0,失败返回错误码 **示例**: ```c pthread_t tid; void* thread_func(void* arg) { /* 线程逻辑 */ } pthread_create(&tid, NULL, thread_func, NULL); ``` #### 2. pthread_join:线程资源回收 **功能**:阻塞等待指定线程结束并回收资源[^2] **原型**: ```c int pthread_join(pthread_t thread, void **retval); ``` **参数说明**: - `thread`:目标线程ID - `retval`:接收线程退出状态(可为NULL) **注意事项**: - 只能对 *joinable*(非分离)线程调用 - 未join的线程会残留资源(类似僵尸进程) - 线程结束前会阻塞调用者[^2] #### 3. pthread_exit:线程主动退出 **功能**:终止当前线程并返回状态值[^4] **原型**: ```c void pthread_exit(void *retval); ``` **参数说明**: - `retval`:线程退出状态(可由pthread_join捕获) **特点**: - 不同于`return`,可在任意函数深度退出线程 - 主线程调用时不会终止进程(仅退出自身) **示例**: ```c void* worker(void* arg) { if(error) pthread_exit((void*)-1); return (void*)0; // 正常退出 } ``` #### 4. pthread_detach:线程分离 **功能**:设置线程为分离状态,结束后自动回收资源[^3] **原型**: ```c int pthread_detach(pthread_t thread); ``` **特点**: - 分离后无需也不能调用`pthread_join`[^3] - 可在线程内调用`pthread_detach(pthread_self())` - 资源回收由系统自动完成 **典型用法**: ```c pthread_create(&tid, NULL, func, NULL); pthread_detach(tid); // 主线程不阻塞等待 ``` --- ### 关键区别总结 | 函数 | 作用 | 资源回收方式 | 阻塞调用者 | |-----------------|-----------------------|----------------------|------------| | `pthread_join` | 等待线程结束 | 手动回收(需显式调用) | 是 | | `pthread_detach`| 设置线程分离 | 系统自动回收 | 否 | | `pthread_exit` | 终止当前线程 | 依赖join/detach设置 | - | | `pthread_create`| 创建线程 | - | - | > ⚠️ **重要规则**: > 1. 线程**不能同时被join和detach**[^3] > 2. 未分离且未join的线程会造成资源泄漏 > 3. 主线程退出会导致所有线程终止(除非调用`pthread_exit`) --- ### 综合示例 ```c #include <pthread.h> void* worker(void* arg) { printf("Working...\n"); pthread_exit(NULL); // 显式退出 } int main() { pthread_t tid; pthread_create(&tid, NULL, worker, NULL); // 可选方案1:等待回收 pthread_join(tid, NULL); // 可选方案2:分离(二选一) // pthread_detach(tid); return 0; } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值