Linux 线程中创建线程
在Linux操作系统中,线程是轻量级的执行单元,共享进程的资源(如内存、文件描述符等),能够实现高效的并发编程,与进程相比,线程的创建、销毁和切换开销更小,适合需要处理大量并发任务的应用场景,Linux提供了多种线程创建方式,其中最常用的是基于POSIX线程(pthread)库的pthread_create函数,本文将详细介绍Linux中线程的创建机制、相关函数、参数配置、注意事项以及实际应用示例。

线程与进程的区别
在深入探讨线程创建之前,有必要明确线程与进程的核心区别,进程是资源分配的基本单位,拥有独立的地址空间和系统资源;而线程是CPU调度的基本单位,同一进程内的线程共享进程的资源(如代码段、数据段、堆等),但拥有独立的栈空间,这种共享特性使得线程间通信(IPC)更加高效,但也需要同步机制(如互斥锁、条件变量)来避免竞争条件。
POSIX线程(pthread)概述
POSIX线程(简称pthread)是Linux线程编程的标准接口,定义了一套线程操作的API,pthread库提供了线程创建、同步、销毁等功能,其头文件为<pthread.h>,编译时需要链接-pthread选项,pthread线程遵循POSIX.1c标准,具有良好的可移植性,广泛应用于多线程程序开发。
线程创建的核心函数:pthread_create
线程创建的核心函数是pthread_create,其原型如下:
#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
-
参数说明:
thread:指向线程标识符的指针,用于后续操作(如线程等待、分离)。attr:指向线程属性对象的指针,若为NULL则使用默认属性(如默认栈大小、调度策略等)。start_routine:线程启动函数,其类型为void *(*)(void *),即接收一个void*参数并返回void*的函数指针。arg:传递给线程启动函数的参数,若无需参数可设为NULL。
-
返回值:
成功时返回0,失败时返回错误码(如EAGAIN表示资源不足,EINVAL表示属性无效)。
线程属性配置
通过pthread_attr_t结构体,可以自定义线程的属性,包括:
- 分离状态(detachstate):
PTHREAD_CREATE_JOINABLE:线程默认状态,其他线程可通过pthread_join等待其结束。PTHREAD_CREATE_DETACHED:线程结束后自动释放资源,无需其他线程等待。
- 栈大小(stacksize):默认通常为8MB,可通过
pthread_attr_setstacksize调整。 - 调度策略(schedpolicy):如
SCHED_RR(轮转调度)、SCHED_FIFO(先入先出调度)等。 - 优先级(schedparam):通过
struct sched_param设置线程优先级。
示例代码:设置线程为分离状态
pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&thread, &attr, thread_func, NULL); pthread_attr_destroy(&attr);
线程的终止与回收
线程可以通过以下方式终止:
- 启动函数返回:线程执行完毕后自动退出,返回值可通过
pthread_join获取。 - 调用
pthread_exit:主动退出线程,并传递返回值。 - 被其他线程取消:通过
pthread_cancel发送取消请求,目标线程在取消点(如系统调用)响应。
若线程为JOINABLE状态,需使用pthread_join回收资源:
void *thread_ret; pthread_join(thread, &thread_ret); // 阻塞等待线程结束,获取返回值
对于DETACHED线程,无需显式回收,资源由系统自动释放。

线程同步机制
由于共享资源的存在,多线程程序需要同步机制避免数据竞争:
- 互斥锁(Mutex):保护临界区,确保同一时间只有一个线程访问共享资源。
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); // 临界区代码 pthread_mutex_unlock(&mutex);
- 条件变量(Condition Variable):与互斥锁配合,实现线程间的等待/通知机制。
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_cond_wait(&cond, &mutex); // 等待条件满足 pthread_cond_signal(&cond); // 通知等待线程
- 读写锁(RWLock):允许多个读线程或一个写线程同时访问资源,适用于读多写少的场景。
线程创建的注意事项
- 资源竞争:避免多个线程同时修改共享数据,需通过同步机制保护临界区。
- 死锁:谨慎处理锁的获取顺序,避免循环等待(如线程A锁住资源1等待资源2,线程B锁住资源2等待资源1)。
- 栈溢出:默认栈大小可能不足,可通过
pthread_attr_setstack自定义栈空间。 - 可移植性:pthread库在大多数Unix-like系统中可用,但部分属性(如调度策略)可能需要内核支持。
实际应用示例:多线程文件处理
以下代码演示了创建多个线程并行处理文件内容的场景:
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#define NUM_THREADS 4
void *process_file(void *arg) {
char *filename = (char *)arg;
FILE *file = fopen(filename, "r");
if (!file) {
perror("Failed to open file");
return NULL;
}
char line[256];
while (fgets(line, sizeof(line), file)) {
printf("Thread %lu: %s", pthread_self(), line);
}
fclose(file);
return NULL;
}
int main() {
pthread_t threads[NUM_THREADS];
const char *files[NUM_THREADS] = {"file1.txt", "file2.txt", "file3.txt", "file4.txt"};
for (int i = 0; i < NUM_THREADS; i++) {
if (pthread_create(&threads[i], NULL, process_file, (void *)files[i]) != 0) {
perror("Failed to create thread");
return 1;
}
}
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
Linux中的线程创建是多线程编程的基础,通过pthread_create函数可以灵活地管理并发任务,合理配置线程属性、使用同步机制以及注意资源竞争问题,是编写高效稳定多线程程序的关键,pthread库的强大功能和广泛支持,使其成为Linux环境下并发开发的首选工具,掌握线程创建与管理的核心技术,能够显著提升程序的性能和响应速度,适用于服务器编程、实时系统、并行计算等多种场景。















