所以我有一个用数字进行这些计算的程序。该程序是线程化的,并且用户指定了线程数。
我将举一个密切的例子
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 ......但那又是什么?
答案 0 :(得分:0)
你有多种方法可以做到:
,第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作为指针,这通常是一个坏主意。如果您想将更多信息传输到您的主题,只需将其隐藏到结构中即可。
我不确定我是否完全理解你的问题,但这可能会给你一些提示。另请注意,在进行多线程处理时,您需要考虑特定问题,如竞争条件,并发访问和对象的更复杂的生命周期......