在C语言中,线程的创建和管理可以通过 POSIX 线程(pthread)库来实现。这个库提供了多种方法来控制线程的行为,其中 join()
和 detach()
是两个重要的函数。
pthread_join()
函数用于等待一个特定的线程结束。它允许主线程等待一个子线程完成其执行。这在多线程编程中很有用,因为有时我们需要等待一个线程完成其工作,然后再继续主线程的执行。
这是 pthread_join()
的原型:
int pthread_join(pthread_t thread, void **retval);
其中,thread
是你想要等待的线程的标识符,retval
是一个可选参数,用于获取线程的返回值。如果这个参数是 NULL,那么线程的返回值将被丢弃。
如果 pthread_join()
成功,它将返回0。如果发生错误,它将返回一个错误码。
2. detach()
pthread_detach()
函数用于将一个线程分离。一旦一个线程被分离,它的资源将被回收,但是它的执行结果(如果有的话)将不会返回给主线程。分离的线程就像已经正常结束一样。
这是 pthread_detach()
的原型:
int pthread_detach(pthread_t thread);
如果 pthread_detach()
成功,它将返回0。如果发生错误,它将返回一个错误码。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *worker(void *arg) {
// 这是一个模拟的长时间运行任务
sleep(3);
printf("Worker thread finished.\n");
return NULL;
}
int main() {
pthread_t thread;
int rc;
// 创建线程并立即分离
rc = pthread_create(&thread, NULL, worker, NULL);
if (rc) {
printf("Error: return code from pthread_create() is %d\n", rc);
exit(-1);
}
printf("Thread created and detached.\n");
// 主线程继续执行其他任务...
printf("Main thread doing other work...\n");
sleep(2);
printf("Main thread done.\n");
return 0;
}
在上面的示例中,创建了一个工作线程,并立即将其分离。这意味着工作线程将在后台运行,并且当主线程结束时,工作线程也会被自动回收。可以看到,主线程继续执行其他任务,并在完成后结束。工作线程在后台运行,并在完成后打印一条消息。
.join()
确保主线程会在子线程完成之前一直等待,确保子线程的清理工作得以执行,并安全地回收资源。.detach()
则让子线程成为一个“守护”线程,主线程不关心其结束状态,子线程结束后由系统自动清理资源,但要注意,detach后的线程必须自行处理好自己的资源释放问题,因为它不可能再被join回来。