QtConcurrent programming need help
-
I am working on an existing application where threads are submitted concurrently. he is submitting 8 threads together and then he is waiting for all 8 threads to be finished to submit the next 8 threads. In this way after every 8 threads he is waiting and a lot of time is being taken for waiting. Can you me some suggestions how can I skip this waiting after submitting 8 threads to improve speed. Total number of cpu is 8 so he is submitting 8 threads at a time.
Submitting threads like this
[code]
int nCpus = Environment::Get_No_Of_Cpus(); // ==8
for(z=0; z<21; z++)
{
for (int cpuID=0; cpuID<nCpus; cpuID++)
{
Th = QtConcurrent::run(this, zLayerFunction,z,...,cpuID);
Threads.push_back(Th);
}
//then he after submitting 8 threads, he is waiting for all 8 threads to be finished to submit the next 8 threads.
for(int th=0; th<Threads.size(); th++ )
{
Threads.at(th).waitForFinished(); Threads.cancel();
}
Threads.clear();
z--;
}
[/code]
How can i improve the speed so that it doesn't wait. How can I make it continuous. Any suggestions would be highly appreciated. Thanks Sujan
-
You could have something like this:
@
listOfThreads threads; //This is a list of all threads that should be run. We will pull out one after the other
fillListofThreads(); //Here we fill the above list with threads to run
listOfThreads runningThreads; //This list will hold all threads currently running
for(int i = 0; i < 8; i++)
runningThreads.push(threads.pop()); //We take the first 8 threads and put them into the running list...
foreach(Thread thread, runningThreads)
thread.start(); //and start them
while(listOfThreads is not empty and runningThreads is not empty){ // we continue to loop till we have ran all threads
foreach(Thread thread, runningThreads){
if(thread.isFinished(){ //is one of the running threads finished?
runningThreads.remove(thread); //then remove it...
if(listOfThreads is not empty){ //..and if we still have threads...
Thread t = listOfThreads.pop(); //..take the next one...
t.start(); //...start it...
runningThreads.push(t); //..and put it into the list for running threads
}
}
}
@This should always have 8 threads running.
(It's only pseudo code, so don't try to compile it directly :))Janf
-
Thanks JanDal I'll try this out.
-
You also asked this question on the interest@qt-project.org mailinglist, right? What in the answers there wasn't enough to warrant a post here as well?
-
I asked both the places at the same time.
-
how can I keep track of the cpuID on which the thread is running.
Th=QtConcurrent::run(this,&UnrstParser::zLayer,z,cpuID);I want to submit for z=0 to z =31 total 32 threads in sequence. They should be submitted and run in 8 cpus one by one in sequence. Please help.