在Linux环境下,我们可以使用POSIX线程库(pthreads)来实现线程池。以下是一个简单的线程池实现的例子:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_THREADS 5
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_t threads[MAX_THREADS];
int thread_count;
void* worker(void* arg) {
while(1) {
pthread_mutex_lock(&mutex);
while (thread_count == 0) // 如果没有任务,则等待
pthread_cond_wait(&cond, &mutex);
// 任务到达,执行任务
printf("Thread %lu processing task\n", pthread_self());
thread_count--;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void start_thread(int i) {
pthread_create(&threads[i], NULL, &worker, NULL);
}
int main() {
thread_count = 0;
for (int i = 0; i < MAX_THREADS; i++)
start_thread(i);
// 模拟提交任务
pthread_mutex_lock(&mutex);
thread_count++;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
// 主线程做其他事情
sleep(1);
return 0;
}
这个例子中,我们创建了一个有5个线程的线程池。worker
函数作为线程的入口点,它会一直循环等待条件变量cond
被触发。当主线程需要执行任务时,它会通过锁定互斥量并改变条件(thread_count++
),然后发送一个信号给条件变量cond
,这会唤醒至少一个等待中的线程来处理任务。
这个简单的线程池实现可以作为学习线程池概念的起点。在实际应用中,你可能需要一个更加复杂的设计,包括任务队列、超时处理、资源管理等。