如何使程序以这种方式工作?

时间:2011-07-12 12:33:27

标签: c pthreads

所以我有一个用数字进行这些计算的程序。该程序是线程化的,并且用户指定了线程数。

我将举一个密切的例子

static void *program_thread(void *thread)
{

    bool somevar = true;

    if(somevar)
    {
        work = getwork();
    }

    dowork(work);

    if(condition1 blah blah)
        somevar = false; /* disable getwork */

    if(condition2)
       somevar = true; /* condition was either met or not met, so we request 
new work either way */  

}

然后用pthreads(我会跳过一些代码)我做

int main(blah)
{
    if (pthread_create(&thr->pth, NULL, program_thread, thread_number)) {
        printf("%s","program thread create failed");
        return 1;
    }
}

现在我将开始解释。创建的线程数是从用户指定的,所以我做了一个for循环并创建了我需要的尽可能多的线程。 每个线程调用

work = getwork();

因此,要做独立的工作,但CPU对这种工作来说很慢。它试图通过尝试2 ^ 32个数字(从1到4 294 967 296)来计算某些东西

但我的CPU每秒只能处理大约300万个数字,当它达到40亿个数字时,它会重新启动(用于新工作)。

所以我想到了一个更好的方法。而不是每个线程完全不同的工作,所有线程应该得到相同的工作分割他们需要尝试的数字。

问题是,我无法控制它得到的工作,所以我必须提取

work = getwork();

在启动线程之前。问题是如何?显然使用pthread_create ......但那又是什么?

1 个答案:

答案 0 :(得分:0)

你有多种方法可以做到:

  • 将您的工作包拆分为较小的部分(因此,您的getWork将返回一个较小的新工作)
  • 将您的作品存储在一个公共场所,您可以使用reader-writer pattern
  • 从线程中访问该作品 来自pthread API
  • ,第4个参数被赋予你的主题,你可以做类似下面的代码:

    Work = getWork();
    if (pthread_create(&thr->pth, NULL, program_thread, (void*) &work))
           ...
    

    你的program_thread函数就是那样

    static void *program_thread(void *pxThread)
    {
      Work* pWork = (Work*) pxThread;
      ...
    

    当然,您需要检查指针和常见内容的有效性(在我的示例中,我在堆栈上创建它,这可能是一个坏主意)。请注意,您的代码是一个thread_number作为指针,这通常是一个坏主意。如果您想将更多信息传输到您的主题,只需将其隐藏到结构中即可。

我不确定我是否完全理解你的问题,但这可能会给你一些提示。另请注意,在进行多线程处理时,您需要考虑特定问题,如竞争条件,并发访问和对象的更复杂的生命周期......