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

C 如何使程序以这种方式工作?,c,pthreads,C,Pthreads,所以我有一个程序,可以用数字进行计算。程序是线程化的,线程数由用户指定 我将举一个很好的例子 static void *program_thread(void *thread) { bool somevar = true; if(somevar) { work = getwork(); } dowork(work); if(condition1 blah blah) somevar = false; /* d

所以我有一个程序,可以用数字进行计算。程序是线程化的,线程数由用户指定

我将举一个很好的例子

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(我将跳过一些代码),我会这样做

现在我开始解释。创建的线程数量由用户指定,因此我执行for循环,并根据需要创建尽可能多的线程。 每个线程调用

work = getwork();
因此,独立的工作要做,然而CPU对于这种工作来说速度很慢。它试图通过尝试2^32个数字(从1到429497296)来计算一些东西

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

于是我想到了一个更好的方法。不是每个线程得到完全不同的功,而是所有线程都应该得到相同的功,并将需要尝试的数拆分

问题是,我无法控制它得到的功,所以我必须去拿

work = getwork();

在启动线程之前。问题是怎么做?显然,使用pthread_create…但是接下来呢?

您可以使用多种方法来实现:

  • 将工作包拆分为更小的部分(因此,getWork返回一个新的更小的工作)
  • 将您的工作存储在一个公共位置,您可以使用
  • 从中,第4个参数被赋予线程,您可以执行类似以下代码的操作:

    Work = getWork();
    if (pthread_create(&thr->pth, NULL, program_thread, (void*) &work))
           ...
    
    你的程序线程函数是这样的

    static void *program_thread(void *pxThread)
    {
      Work* pWork = (Work*) pxThread;
      ...
    
    当然,您需要检查指针和常见内容的有效性(在我的示例中,我在堆栈上创建了它,这很可能是个坏主意)。请注意,您的代码将线程号作为指针,这通常不是一个好主意。如果您想将更多信息传输到线程中,只需将其隐藏到结构中即可


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

密集的不是getwork,而是dowork。它需要通过尝试从10亿到40亿的每个数字来计算一些东西。但是它的效率很低,因为它很慢而且跟不上。因此,每个线程必须将这40亿个数字除以2。因此,如果我启动两个线程,那么Thread1从1工作到2147483648,thread2从2147483649工作到4294967296,正如您所说的,首先调用getwork,如果不是为了降低速度,只需在主线程上执行,那么根据用户选择的线程数执行简单的除法,以均匀地分解工作。然后调用两个pthread_创建的线程?但我将如何重新启动它们?我指的是新工作。
static void *program_thread(void *pxThread)
{
  Work* pWork = (Work*) pxThread;
  ...