Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 寻求MT设计模式的帮助_Multithreading - Fatal编程技术网

Multithreading 寻求MT设计模式的帮助

Multithreading 寻求MT设计模式的帮助,multithreading,Multithreading,我有一个1000个工作项的队列和一个n-proc机器,假设n= 4.主线程一次生成n=4个工作线程 迭代并等待所有线程在处理之前完成 接下来的n=4项,直到处理完整个队列 for(i= 0 to queue.Length / numprocs) for(j= 0 to numprocs) { CreateThread(WorkerThread,WorkItem) } WaitForM

我有一个1000个工作项的队列和一个n-proc机器,假设n= 4.主线程一次生成n=4个工作线程 迭代并等待所有线程在处理之前完成 接下来的n=4项,直到处理完整个队列

for(i= 0 to queue.Length / numprocs) 
        for(j= 0 to numprocs) 
        { 


                CreateThread(WorkerThread,WorkItem) 


        } 
        WaitForMultipleObjects(threadHandle[]) 
每个辅助线程所做的工作是不均匀的 如果线程1花费1000秒做功,其余3个线程则为1批n 线程仅1秒,以上设计效率低,因为1秒后 其他3个处理器处于空闲状态。此外,没有池-1000 正在创建不同的线程

如何使用我不太熟悉的NT线程池-因此 冗长的问题和QueueUserWorkitem来实现上述功能。这个 以下约束条件应适用

主线程要求处理所有工作项 它可以继续,所以我认为上面的waitall结构 是必需的 我想创建和处理器一样多的线程,而不是1000个线程 一次
另外,我不想创建1000个不同的事件,请传递给工人 线程,并使用QueueUserWorkitem API或 否则 ExcIngNeg代码是C++的,喜欢C++,因为我不知道C 我怀疑以上是一个非常常见的模式,我一直在寻找
你的输入。

我不是C++程序员,所以我给你一些半个伪代码,

tcount = 0
maxproc = 4
while queue_item = queue.get_next() # depends on implementation of queue
                                    # may well be: 
                                    # for i=0; i<queue.length; i++
    while tcount == maxproc
        wait 0.1 seconds # or some other interval that isn't as cpu intensive 
                         # as continously running the loop
    tcount += 1 # must be atomic (reading the value and writing the new 
                # one must happen consecutively without interruption from 
                # other threads). I think ++tcount would handle that in cpp.
    new thread(worker, queue_item)

function worker(item)
    # ...do stuff with item here...
    tcount -= 1 # must be atomic

另外,我不想创建1000个不同的事件,传递给工作线程,并使用QueueUserWorkItemAPI等待所有事件,否则为什么不呢?对我来说似乎是一个合理的方法。事实上,这是你能得到的最有效的方法。它将其限制为4个工作线程,并在给定的等待时间内,在任何线程可用时立即执行下一项。唯一的问题是工作线程必须处理一个外部变量,这可能会打破一些好的约定,但只需对其进行注释就可以清楚地表明这一点,这是一个非常有效的攻击。