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 用于将一个线程标识符指定的线程标记为可分离的状态,使其在结束时自动释放资源。