0

我正在尝试使用 POSIX 线程编写一个 C 程序,将一个正方形分成 4,然后一次又一次地将其中的一些 8 划分,直到满足某些条件。所以通常程序是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define checkResults(string, val) {             \
 if (val) {                                     \
   printf("Failed with %d at %s\n", val, string); \
   exit(1);                                     \
 }                                              \
}

void *editSquare(void *arg);

void divide(void *arg){
    int i,rc;
    Square *s = (Square *) arg;
    pthread_t thr[4];

    Square divs[4];
    for (i=0;i<4;i++){
        rc=pthread_create(&thr[i],NULL, editSquare,(void *) &divs[i]);
        checkResults("pthread create",rc);
    }
    for (i=0;i<4;i++){
        rc=pthread_join(thr[i],NULL);
        checkResults(" pthread join ",rc);
    }

}

void *editSquare(void *arg){
    int i,rc;
    Square *s = (Square *) arg;
    if ( !some conditions ){
        // do stuff
        // ...
        divide(s);
    }
    else{
        //do stuff
    }
}

int main(){
    Square sq;
    //initialize sq
    divide(&sq);
    return 0;
}

这可能会很深,在某些时候我在 pthread_create 收到错误代码 11。我知道它为我的 cpu 创建了太多线程导致错误。有没有一种方法/技术我可以控制/管理活动的数量线程并暂停一些线程,直到其他一些线程结束,然后再创建它们?一般来说,有没有一种方法可以虚拟创建 N 个线程,这些线程在多个 max_threads 之后实际上并不并行运行,而是进入某种等待创建的 FIFO 队列?

(如果您认为需要,我可以更具体地了解程序或结构......)

4

1 回答 1

0

我收到错误代码 11

那是EAGAIN在Linux上。

有没有一种方法/技术可以控制/管理活动线程的数量并停止一些线程,直到其他一些线程结束,

当然:创建一个全局线程计数器和一个条件变量。任何新线程都会增加计数器(在互斥锁下)。当计数器即将超过某个限制时,不要创建任何新线程,而是等待条件。退出线程应减少计数器和信号条件。

尽管由于问题的递归性质,这可能无法解决您的问题(当所有线程必须在退出之前创建额外的线程,但您没有可用线程时,您将陷入死锁)。

更好的解决方案是创建一个工作队列和一个线程池。池中的任何线程都会在队列可用时从队列中提取下一个工作项,并将新的工作项附加到队列的末尾。

于 2013-11-14T02:45:58.140 回答