面试题答案
一键面试- 线程创建阶段:
- 操作:
- 调用
pthread_create
函数,传递线程函数指针、线程属性(可设为NULL
使用默认属性)以及传递给线程函数的参数。此函数用于创建一个新的线程,新线程开始执行指定的线程函数。例如:
- 调用
- 操作:
#include <pthread.h>
#include <stdio.h>
void* thread_function(void* arg) {
printf("Thread is running\n");
return NULL;
}
int main() {
pthread_t thread;
int ret = pthread_create(&thread, NULL, thread_function, NULL);
if (ret != 0) {
printf("Failed to create thread\n");
return 1;
}
pthread_join(thread, NULL);
return 0;
}
- 线程初始化阶段:
- 操作:
- 线程开始执行线程函数,可能会初始化一些局部变量,为后续工作做准备。比如,若线程需要处理特定的数据结构,可能在此阶段对该数据结构进行初始化。例如,如果线程要处理链表,可能会初始化链表头指针等操作。
- 操作:
- 任务执行阶段:
- 操作:
- 从任务队列中获取任务。在线程池模型中,通常有一个共享的任务队列,线程会从这个队列中取出任务。例如,在生产者 - 消费者模型的线程池中,消费者线程(即线程池中的线程)从任务队列(共享缓冲区)中取出任务。
- 执行任务逻辑。线程执行具体的业务逻辑,这可能涉及到文件操作、网络通信、数据计算等各种操作。例如,若任务是处理一个文件中的数据,线程会打开文件,读取数据,进行相应的计算或处理,然后可能关闭文件。
- 操作:
- 任务等待阶段:
- 操作:
- 当任务队列为空时,线程进入等待状态。一般通过条件变量(
pthread_cond_t
)和互斥锁(pthread_mutex_t
)配合来实现。线程先获取互斥锁,然后调用pthread_cond_wait
函数,该函数会释放互斥锁并使线程进入等待状态,直到有新任务加入任务队列并通过pthread_cond_signal
或pthread_cond_broadcast
唤醒。例如:
- 当任务队列为空时,线程进入等待状态。一般通过条件变量(
- 操作:
pthread_mutex_lock(&mutex);
while (task_queue_is_empty) {
pthread_cond_wait(&cond, &mutex);
}
// 有任务了,获取任务
pthread_mutex_unlock(&mutex);
- 线程销毁阶段:
- 操作:
- 线程收到退出信号(如线程池关闭信号)。这可能是通过共享变量或者特定的通信机制通知线程。
- 清理资源。线程释放其使用的所有资源,如文件描述符、动态分配的内存等。例如,若线程打开了文件,需要在此阶段关闭文件描述符;若线程使用
malloc
分配了内存,需要使用free
释放。 - 调用
pthread_exit
函数退出线程。此函数用于终止当前线程的执行,并可返回一个指针供其他线程(如主线程调用pthread_join
时)获取线程的退出状态。例如:
- 操作:
void* thread_function(void* arg) {
// 线程逻辑
pthread_exit(NULL);
}
若在线程池中,主线程可能会调用pthread_join
等待所有线程完成任务后再销毁线程池资源,pthread_join
用于阻塞调用线程,直到指定线程终止。