Chamar uma função com diferente número de segmentos passados ??para o aplicativo
-
16-09-2019 - |
Pergunta
Eu tenho uma função que precisa ser chamado com um número diferente de tópicos de cada vez (estou fazendo algum cálculo de desempenho, por isso necessidade de saber quando o desempenho começa a deteriorar). Exemplo é dado abaixo:
getTime() {
return 0;
}
int main() {
boost::threadpool::thread_pool<> threads(nThreads);
for(int j = 0; j <= nLines; j++){
threads.schedule(boost::bind(&getTime, nThreads, 1));
}
threads.wait();
}
Onde, nThreads: O valor de um dado na linha de comando
A minha pergunta é, se este me dar o resultado desejado, como a faria esta chamada a função 'getTime' com 'nThreads' cada vez que o loop é acessado pelo programa? Ou que eu preciso de algum outro método para descobrir o mesmo?
o que eu realmente quero fazer é esta:
boost::threadpool::thread_pool<> threads(nThreads);
// start a new thread that calls the "getTime" function
for(int j = 0; j <= nLines; j++){
//threads.schedule(boost::bind(&getTime, nThreads, 1));
threads.schedule(boost::bind(&getTime, 0, nLines, pc));
}
(não tenho certeza qual das alternativas acima está correta.)
a função getTime () é para ser executado com um determinado número de linhas que eu começar a partir de um arquivo de texto e dar a cada linha para uma API, cujo desempenho i deseja calcular. mas isso não está relacionado com a pergunta que eu tenho.
i deseja chamar uma função com diferente número de tópicos de cada vez e calcular quanto tempo demorou cada thread ao fim. Qual foi o tempo total tomado com 1 fio, qual foi o tempo total por 2 fios para acabamento, etc.
Solução
Se bem entendi, o que você realmente quer fazer é algo como isto:
int main()
{
int nbThreads = 20;
boost::threadpool::thread_pool<> threads(nbThreads);
for(int threadId = 0; threadId <= nbThreads ; ++threadId)
{
threads.schedule(getTime);
}
threads.wait();
}
Se estou certo, você não precisa usar boost :: bind aqui.
Note que Boost.ThreadPool não faz parte do Impulso (ainda?-Lo). Será revisada , mas nenhuma data de revisão ainda não foi planejado.
Outras dicas
Que tal usar algo como OpenMP ? Se escalabilidade é o seu objetivo, é provavelmente uma escolha melhor.