#include <pthread.h>

#include <pthread.h>

<pthread.h>POSIX 线程(Pthreads) 的标准头文件,用于 多线程编程。它提供了创建、同步和管理线程的函数,是 Linux/Unix 系统下多线程开发的核心库。


1. 核心功能

功能关键函数用途
线程创建pthread_create()创建新线程
线程终止pthread_exit(), pthread_cancel()终止当前线程或指定线程
线程同步pthread_mutex_*, pthread_cond_*互斥锁、条件变量
线程连接pthread_join()等待线程结束并获取返回值
线程属性pthread_attr_*设置线程属性(如栈大小、分离状态)

2. 详细函数解析

2.1 线程创建与管理

(1) pthread_create() - 创建线程

1
2
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
  • 参数:

    • thread:存储新线程 ID。
    • attr:线程属性(NULL 表示默认)。
    • start_routine:线程入口函数(返回 void*,参数 void*)。
    • arg:传递给 start_routine 的参数。
  • 返回值:

    • 成功:0
    • 失败:错误码(非 errno)。
  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <pthread.h>
    #include <stdio.h>

    void* print_hello(void *arg) {
    printf("Hello from thread! Arg: %d\n", *(int*)arg);
    return NULL;
    }

    int main() {
    pthread_t tid;
    int arg = 42;
    pthread_create(&tid, NULL, print_hello, &arg);
    pthread_join(tid, NULL); // 等待线程结束
    return 0;
    }

(2) pthread_exit() - 线程退出

1
void pthread_exit(void *retval);
  • 功能:终止当前线程,retval 可被 pthread_join() 捕获。
  • 注意main() 中调用会导致进程退出(除非其他线程在运行)。

(3) pthread_cancel() - 取消线程

1
int pthread_cancel(pthread_t thread);
  • 问题:目标线程需在可取消点(如 sleep())才能终止。

2.2 线程同步

(1) 互斥锁(Mutex)

1
2
3
4
5
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 静态初始化
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    pthread_mutex_t mutex;

    void* thread_func(void *arg) {
    pthread_mutex_lock(&mutex);
    printf("Critical section\n");
    pthread_mutex_unlock(&mutex);
    return NULL;
    }

    int main() {
    pthread_mutex_init(&mutex, NULL);
    pthread_t tid;
    pthread_create(&tid, NULL, thread_func, NULL);
    pthread_join(tid, NULL);
    pthread_mutex_destroy(&mutex);
    return 0;
    }

(2) 条件变量(Condition Variable)

1
2
3
4
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_signal(pthread_cond_t *cond); // 唤醒一个线程
int pthread_cond_broadcast(pthread_cond_t *cond); // 唤醒所有线程
  • 典型用途:生产者-消费者模型。

  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int data_ready = 0;

    void* consumer(void *arg) {
    pthread_mutex_lock(&mutex);
    while (!data_ready) {
    pthread_cond_wait(&cond, &mutex); // 自动释放锁并等待
    }
    printf("Consumed data\n");
    pthread_mutex_unlock(&mutex);
    return NULL;
    }

    void* producer(void *arg) {
    pthread_mutex_lock(&mutex);
    data_ready = 1;
    pthread_cond_signal(&cond); // 通知消费者
    pthread_mutex_unlock(&mutex);
    return NULL;
    }

2.3 线程连接与分离

(1) pthread_join() - 等待线程结束

1
int pthread_join(pthread_t thread, void **retval);
  • 功能:阻塞当前线程,直到 thread 终止,retval 接收返回值。
  • 注意:线程必须是非分离的(joinable)。

(2) pthread_detach() - 分离线程

1
int pthread_detach(pthread_t thread);
  • 功能:线程终止后自动释放资源,不可再 pthread_join()

3. 线程属性

设置线程栈大小

1
2
3
4
5
6
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 1024 * 1024); // 1MB 栈
pthread_t tid;
pthread_create(&tid, &attr, thread_func, NULL);
pthread_attr_destroy(&attr);

分离状态

1
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

4. 完整示例

多线程计算数组和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <pthread.h>
#include <stdio.h>

#define ARRAY_SIZE 10
int array[ARRAY_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = 0;
pthread_mutex_t mutex;

void* sum_part(void *arg) {
int start = *(int*)arg;
int partial_sum = 0;
for (int i = start; i < start + 5; i++) {
partial_sum += array[i];
}
pthread_mutex_lock(&mutex);
sum += partial_sum;
pthread_mutex_unlock(&mutex);
return NULL;
}

int main() {
pthread_t t1, t2;
int start1 = 0, start2 = 5;
pthread_mutex_init(&mutex, NULL);
pthread_create(&t1, NULL, sum_part, &start1);
pthread_create(&t2, NULL, sum_part, &start2);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&mutex);
printf("Total sum: %d\n", sum); // 输出 55
return 0;
}

5. 注意事项

  1. 错误处理:
    • Pthreads 函数返回错误码(非 errno),需用 strerror() 打印。
  2. 资源泄漏:
    • 忘记 pthread_join()pthread_detach() 会导致僵尸线程。
  3. 死锁风险:
    • 确保互斥锁在所有分支(如 return 前)解锁。
  4. 性能考量:
    • 线程创建开销大,考虑使用线程池。

6. 总结

<pthread.h> 的核心用途:

  1. 线程生命周期管理:
    • pthread_create(), pthread_exit(), pthread_join()
  2. 同步机制:
    • 互斥锁(pthread_mutex_*)、条件变量(pthread_cond_*)。
  3. 高级控制:
    • 线程属性(栈大小、分离状态)。

适用于 高并发服务器、并行计算、实时系统