当前位置:首页 > 系统教程 > 正文

Linux多线程线程控制详解(从创建到终止,小白也能学会的线程控制教程)

Linux多线程线程控制详解(从创建到终止,小白也能学会的线程控制教程)

在Linux系统编程中,多线程是一种重要的并发编程技术,它允许一个进程内同时运行多个执行流,从而提高程序的效率和响应能力。而线程控制则是对这些线程进行管理的基础,包括线程的创建、等待和终止。本文将详细讲解这些核心操作,即使你是初学者也能轻松掌握。

Linux多线程线程控制详解(从创建到终止,小白也能学会的线程控制教程) 多线程 线程控制 pthread_create pthread_join 第1张

一、线程创建 —— pthread_create

创建线程是多线程编程的第一步,Linux提供了pthread_create函数。函数原型如下:

#include int pthread_create(pthread_t thread, const pthread_attr_t attr, void (start_routine) (void ), void arg);
  • thread:指向pthread_t类型的指针,用于存储新线程的ID。
  • attr:线程属性,通常设为NULL使用默认属性。
  • start_routine:线程要执行的函数,格式为void func(void)
  • arg:传递给线程函数的参数。

返回值:成功返回0,失败返回错误码。下面是一个简单的创建线程示例:

#include #include void thread_func(void arg) {    printf("子线程开始运行,参数为:%s", (char*)arg);    return NULL;}int main() {    pthread_t tid;    char *msg = "Hello, thread!";    int ret = pthread_create(&tid, NULL, thread_func, msg);    if (ret != 0) {        printf("线程创建失败,错误码:%d", ret);        return 1;    }    // 注意:这里需要等待线程结束,否则主线程可能先退出    pthread_join(tid, NULL);    return 0;}

通过pthread_create,我们可以轻松开启一个新的执行流。

二、线程等待 —— pthread_join

当主线程(或其他线程)需要等待某个线程结束并获取其返回值时,可以使用pthread_join函数。它类似于进程中的wait()。函数原型:

int pthread_join(pthread_t thread, void retval);
  • thread:要等待的线程ID。
  • retval:指向指针的指针,用于存储线程的返回值(如果不关心可设为NULL)。

调用pthread_join的线程会阻塞,直到目标线程终止。正确使用pthread_join可以避免僵尸线程,并获取线程的退出信息。示例:

void calc(void arg) {    int num = (int)arg;    int *result = malloc(sizeof(int));    result = (num) * 2;    return (void*)result;}int main() {    pthread_t tid;    int input = 10;    pthread_create(&tid, NULL, calc, &input);    void ret;    pthread_join(tid, &ret);    printf("线程计算结果:%d", (int)ret);    free(ret);    return 0;}

三、线程终止 —— pthread_exit 和 pthread_cancel

线程可以在执行完毕后自然返回,也可以主动调用pthread_exit终止自己,或被其他线程通过pthread_cancel取消。

1. pthread_exit:主动退出

在线程函数中调用pthread_exit(void retval)可以立即终止当前线程,并返回retval给等待它的线程(如果有)。注意,如果主线程调用pthread_exit,进程不会终止,只会结束主线程,其他线程继续运行。示例:

void worker(void arg) {    static int status = 100;    printf("工作线程正在执行...");    pthread_exit((void*)&status);}int main() {    pthread_t tid;    void ret;    pthread_create(&tid, NULL, worker, NULL);    pthread_join(tid, &ret);    printf("线程退出状态:%d", (int)ret);    return 0;}

2. pthread_cancel:取消线程

一个线程可以向另一个线程发送取消请求,使用pthread_cancel(pthread_t thread)。被取消的线程会在特定的取消点(如readwritesleep等系统调用)响应取消请求。如果线程需要被立即取消,可以设置取消类型为异步。示例:

void busy(void* arg) {    while(1) {        printf("工作中...");        sleep(1);    }    return NULL;}int main() {    pthread_t tid;    pthread_create(&tid, NULL, busy, NULL);    sleep(3);    pthread_cancel(tid);    pthread_join(tid, NULL);    printf("线程已被取消");    return 0;}

总结

本文详细介绍了Linux下多线程线程控制三大基本操作:使用pthread_create创建线程,用pthread_join等待线程结束,以及通过pthread_exitpthread_cancel终止线程。掌握这些函数是编写健壮多线程程序的基础。在实际开发中,还需要注意线程同步(互斥锁、条件变量等),但本文聚焦于控制层面。希望这篇教程能帮助你开启Linux多线程编程的大门!