在C中的线程素数生成,我如何给每个线程自己的开始和结束?

时间:2013-12-05 17:57:52

标签: c multithreading pthreads primes

我正在尝试编写一个程序,该程序在一定范围内生成素数,并将工作划分为一定数量的线程(作为命令行参数给出的开始,结束和线程数)。每个线程应按顺序生成((end-start)/ numThreads)素数。所以,如果我希望程序产生前2个线程的50个素数,则线程1应该产生2-23而线程2应该产生29-47。到目前为止,我有一个main来处理命令行args并进行一些错误检查,以及一个创建我的线程的函数。我遇到的问题是我不确定如何给每个线程它自己的开始和结束。据我所知,start_routine只能接受一个参数。有没有办法传递线程函数多个参数?或者我应该以不同的方式思考这个问题?使用POSIX线程。谢谢, -DRB

3 个答案:

答案 0 :(得分:2)

你的一个论点是void *。只需将它作为指向结构的指针,将任何你想要的东西放在那里。

例如,

struct Range {
  int begin;
  int end;
};

请注意,除非您已经知道所有素数,否则您的线程无法知道它们将生成多少素数。您可以告诉他们输入范围,让他们找到该范围内的所有素数。即使这样,它们也会复制大量的工作,因为无论哪个线程具有更高的范围,都不知道之前的所有素数。

答案 1 :(得分:2)

假设您正在使用POSIX线程:

在结构中解析开始/结束,在生成线程时将具有所需值的结构实例作为void *指针传递。

    typdef struct boundary_s {
        int max;
        int min;
    } boundary_t;

    ...

    int main(...) {
        ...

        boundary_t thread_arg;
        thread_arg.max = INT_MAX;
        thread_arg.min = INT_MIN;

        pthread_create(<your thread handle>, <your thread attribute>, <your thread routine>, (void *) &thread_arg);

        ...
    }

答案 2 :(得分:1)

当你创建一个线程时,参数可以是任何东西,我发送一个指针数组,每个指针指向我想发送的一个X参数

像:

void* arguments[5];
arguments[0] = &integer;
arguments[2] = &string;
arguments[3] = &otherArray;
...etc...

createThread(thread, arguments);

然后进入线程:

void* thread(void* arguments){
   void* args[] = (void*[])arguments;
   int* integer = arguments[0];
   string* string = arguments[1];
   ...etc...
}