#include <stdio.h>\n#include <stdlib.h>\n#include <pthread.h>\n\ntypedef struct task {\n int id;\n struct task* next;\n} Task;\n\nTask* task_queue = NULL;\npthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\npthread_cond_t cond = PTHREAD_COND_INITIALIZER;\nint num_threads;\nint tasks_remaining = 0;\n\nvoid* worker(void* arg) {\n int thread_id = ((int) arg);\n free(arg);\n\n while (1) {\n pthread_mutex_lock(&mutex);\n while (task_queue == NULL && tasks_remaining > 0) {\n pthread_cond_wait(&cond, &mutex);\n }\n\n if (task_queue == NULL && tasks_remaining == 0) {\n pthread_mutex_unlock(&mutex);\n break;\n }\n\n Task* task = task_queue;\n task_queue = task_queue->next;\n pthread_mutex_unlock(&mutex);\n\n // Process task\n printf("Thread %d processing task %d\n", thread_id, task->id);\n free(task);\n }\n\n printf("Thread %d exiting\n", thread_id);\n pthread_exit(NULL);\n}\n\nvoid enqueue_task(Task* task) {\n pthread_mutex_lock(&mutex);\n task->next = task_queue;\n task_queue = task;\n tasks_remaining++;\n pthread_cond_signal(&cond);\n pthread_mutex_unlock(&mutex);\n}\n\nint main(int argc, char* argv[]) {\n if (argc != 3) {\n printf("Usage: %s num_threads num_tasks\n", argv[0]);\n return 1;\n }\n\n num_threads = atoi(argv[1]);\n int num_tasks = atoi(argv[2]);\n\n pthread_t* threads = malloc(num_threads * sizeof(pthread_t));\n for (int i = 0; i < num_threads; i++) {\n int* thread_id = malloc(sizeof(int));\n thread_id = i;\n pthread_create(&threads[i], NULL, worker, thread_id);\n }\n\n for (int i = 0; i < num_tasks; i++) {\n Task task = malloc(sizeof(Task));\n task->id = i;\n task->next = NULL;\n enqueue_task(task);\n }\n\n pthread_mutex_lock(&mutex);\n tasks_remaining = 0;\n pthread_cond_broadcast(&cond);\n pthread_mutex_unlock(&mutex);\n\n for (int i = 0; i < num_threads; i++) {\n pthread_join(threads[i], NULL);\n }\n\n free(threads);\n return 0;\n}\n\n在这个程序中,每个任务都由一个Task结构表示,其中包含任务的唯一ID和指向下一个任务的指针。任务队列使用一个链表来存储任务。\n\n主线程启动了指定数量的工作线程,并在任务队列为空时等待条件变量。当主线程生成新任务时,它会调用enqueue_task函数将任务添加到队列中,并唤醒一个等待线程。当主线程生成完所有任务后,它会设置tasks_remaining为0,并使用pthread_cond_broadcast函数广播唤醒所有线程。\n\n工作线程在条件变量等待中被唤醒时,会从任务队列中取出一个任务并进行处理。处理完成后,工作线程会继续等待下一个任务的到来,或者在没有任务剩余时退出。\n\n注意,为了保证线程安全,对任务队列的操作(包括添加和移除任务)需要在互斥锁的保护下进行。

Pthreads 任务队列实现:使用条件变量和互斥锁进行线程同步

原文地址: https://www.cveoy.top/t/topic/pPAL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录