您有多种可能性,但主要思想是您必须监视线程以检测它们何时完成工作,并且有办法知道是否还有一些事情要做。
想到的第一个方法是有一个专用线程来跟踪所有正在运行的线程,并在它们完成后回收它们。但是为了做到这一点,您需要一种让线程同步的机制,这可以使用信号量或互斥锁或消息来实现,但如果您不需要它,仅为此目的编写代码可能会很麻烦.
第二种方法是简单地要求他们回收自己,因为他们知道何时完成。在许多其他语言中,有一种称为延续的机制,它可以让你完全做到这一点,但由于我们正在处理 C,我们需要手动完成。幸运的是,这里的延续实际上只是一个单一的任务。
所以调用continuation的机制其实只是一个函数,它会先运行要被线程执行的任务,然后要么:
- 检查任务列表。此任务列表必须在设置时填写任务需要完成的所有工作,
- 将线程添加到可用线程队列中,必须由其他线程再次检查并重新分配新任务,
显然,第一个选项会更容易,并且在您的情况下,您在设置时已经知道必须做什么,因此您的设置功能可以填写任务列表,然后启动任意数量的线程,并让它们自己做回收。
这是一个你可以开始的简单骨架:
 typedef struct {
    /* task related data */
 } task_t;
 // basic list structure
 typedef struct {
   list_t *next;
   void *data; // here app specific data
 } list_t;
 list_t task_list; // your task list
 // a few operators to manipulate a list
 // implementation must use a mutex to avoid race conditions
 void list_push(list *l, void *data);
 void *list_pop(list *l);
 // thread function
 void do_task(task_t *task){
     while (task) {
       run_task(task); // that would be the matrix related function
       task = list_pop(&task_list);
 }
 // here a simple define for the number of threads
 // you might want to check the number of available cores instead
 #define MAX_THREAD_COUNT 4 
 int main() {
   pthread_t threads[MAX_THREAD_COUNT];
   setup_task_list();  // push all the work that must be done in the list
   int i;
   for (i = 0; i < MAX_THREAD_COUNT; i++) {
      pthread_create(threads + i, NULL, do_task, list_pop(&task_list));
   }
   // here wait for all the threads, or detach them
 }
这是您可以做什么的基本大纲,应该可以帮助您入门。关于 SO 处理 C 链表有几个问题。这里的那个必须是同步的,不应该阻塞,NULL空的时候返回。