pthread_exit、pthread_join 和 pthread_detach 之间的区别

作者:编程家 分类: linux 时间:2025-12-21

pthread_exit、pthread_join 和 pthread_detach 之间的区别

在多线程编程中,我们经常会使用线程创建、执行和终止的函数。pthread_exit、pthread_join 和 pthread_detach 是这些函数中常用的三个,它们分别用于线程的终止以及线程的资源回收。在本文中,我们将详细介绍这三个函数的区别,并通过案例代码来说明其使用方法。

pthread_exit

pthread_exit 函数用于在线程中显式地终止线程的执行。它接受一个参数,用于指定线程的返回值。当线程执行到 pthread_exit 时,它会立即终止自己的执行并返回指定的返回值。被终止的线程的资源并不会自动释放,需要通过其他线程调用 pthread_join 或 pthread_detach 来进行资源回收。

下面是一个简单的示例代码,其中创建了两个线程,一个线程执行打印操作,另一个线程在睡眠一段时间后调用 pthread_exit 终止自己的执行:

c

#include

#include

#include

void* print_message(void* ptr) {

char* message = (char*)ptr;

printf("%s\n", message);

pthread_exit((void*)42);

}

int main() {

pthread_t thread1, thread2;

char* message1 = "Hello from thread 1";

char* message2 = "Hello from thread 2";

int ret1, ret2;

ret1 = pthread_create(&thread1, NULL, print_message, (void*)message1);

ret2 = pthread_create(&thread2, NULL, print_message, (void*)message2);

if (ret1 || ret2) {

printf("Failed to create threads\n");

exit(EXIT_FAILURE);

}

pthread_exit(NULL);

}

在上面的代码中,我们创建了两个线程 thread1 和 thread2,并通过 pthread_create 函数分别指定了它们的执行函数为 print_message。这个函数会打印传入的字符串,并通过 pthread_exit 返回一个整数值。

pthread_join

pthread_join 函数用于等待指定的线程结束,并回收其资源。它接受两个参数,第一个参数是要等待的线程标识符,第二个参数是一个指针,用于接收线程的返回值。当调用 pthread_join 时,调用线程会被阻塞,直到指定的线程结束。一旦被等待的线程结束,调用线程会继续执行,并可以通过第二个参数获取被等待线程的返回值。

下面是一个示例代码,其中在主线程中创建了两个子线程,并通过 pthread_join 等待这两个子线程结束:

c

#include

#include

#include

void* print_message(void* ptr) {

char* message = (char*)ptr;

printf("%s\n", message);

pthread_exit((void*)42);

}

int main() {

pthread_t thread1, thread2;

char* message1 = "Hello from thread 1";

char* message2 = "Hello from thread 2";

int ret1, ret2;

void* retval1;

void* retval2;

ret1 = pthread_create(&thread1, NULL, print_message, (void*)message1);

ret2 = pthread_create(&thread2, NULL, print_message, (void*)message2);

if (ret1 || ret2) {

printf("Failed to create threads\n");

exit(EXIT_FAILURE);

}

pthread_join(thread1, &retval1);

pthread_join(thread2, &retval2);

printf("Thread 1 returned: %d\n", (int)retval1);

printf("Thread 2 returned: %d\n", (int)retval2);

pthread_exit(NULL);

}

在上面的代码中,我们通过 pthread_join 等待 thread1 和 thread2 结束,并通过 retval1 和 retval2 获取它们的返回值。

pthread_detach

pthread_detach 函数用于将一个线程标识符指定的线程标记为可分离的状态。可分离的线程在结束时会自动释放其资源,无需其他线程调用 pthread_join 来进行资源回收。调用 pthread_detach 后,线程的资源会在其结束时自动释放。

下面是一个示例代码,其中创建了一个线程并将其标记为可分离状态:

c

#include

#include

#include

void* print_message(void* ptr) {

char* message = (char*)ptr;

printf("%s\n", message);

pthread_exit((void*)42);

}

int main() {

pthread_t thread;

char* message = "Hello from thread";

int ret;

void* retval;

ret = pthread_create(&thread, NULL, print_message, (void*)message);

if (ret) {

printf("Failed to create thread\n");

exit(EXIT_FAILURE);

}

pthread_detach(thread);

sleep(1); // 等待线程结束

printf("Thread returned: %d\n", (int)retval);

pthread_exit(NULL);

}

在上面的代码中,我们使用 pthread_detach 将 thread 标记为可分离状态,然后通过 sleep 函数等待线程结束。在线程结束后,我们打印出其返回值。

通过上述的示例代码和解释,我们可以清晰地了解 pthread_exit、pthread_join 和 pthread_detach 之间的区别。pthread_exit 用于在线程中显式地终止线程的执行,但并不会自动释放线程的资源;pthread_join 用于等待指定的线程结束并回收其资源;pthread_detach 用于将一个线程标识符指定的线程标记为可分离的状态,使其在结束时自动释放资源。