Estoy aprendiendo C++ y realmente no lo he visto en ninguno de los libros que he leído. Quería leer y comentar el código para poder aprender mejor y encontré una sección extraña de código que se ejecuta pero que no tiene una condición. Por lo que leí (y mis experiencias con otros idiomas, necesitas un if, while, for o algo para los bloques).No entiendo este bloque de código (funciona sin condición)
Estoy viendo el paquete thbb threads, así que no estoy seguro de si está relacionado con el lanzamiento de threads o C++ specific (si no reconoce esto como algo común en C++ entonces probablemente sea tdd).
Creo que entiendo lo que hace el código en realidad, pero no estoy seguro de cómo se desencadenó o ejecutó. ¿Algunas ideas?
Aquí está la sección:
{
//this is the graph part of the code
Graph g;
g.create_random_dag(nodes);
std::vector<Cell*> root_set;
g.get_root_set(root_set);
root_set_size = root_set.size();
for(unsigned int trial=0; trial<traversals; ++trial) {
ParallelPreorderTraversal(root_set);
}
}
P. S. Si ayuda, aquí está el archivo completo (el código anterior está en el medio de main()).
#include <cstdlib>
#include "tbb/task_scheduler_init.h"
#include "tbb/tick_count.h"
#include "../../common/utility/utility.h"
#include <iostream>
#include <vector>
#include "Graph.h"
// some forward declarations
class Cell;
void ParallelPreorderTraversal(const std::vector<Cell*>& root_set);
//------------------------------------------------------------------------
// Test driver
//------------------------------------------------------------------------
utility::thread_number_range threads(tbb::task_scheduler_init::default_num_threads);
static unsigned nodes = 1000;
static unsigned traversals = 500;
static bool SilentFlag = false;
//! Parse the command line.
static void ParseCommandLine(int argc, const char* argv[]) {
utility::parse_cli_arguments(
argc,argv,
utility::cli_argument_pack()
//"-h" option for for displaying help is present implicitly
.positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
.positional_arg(nodes,"n-of-nodes","number of nodes in the graph.")
.positional_arg(traversals,"n-of-traversals","number of times to evaluate the graph. Reduce it (e.g. to 100) to shorten example run time\n")
.arg(SilentFlag,"silent","no output except elapsed time ")
);
}
int main(int argc, const char* argv[]) {
try {
tbb::tick_count main_start = tbb::tick_count::now(); //tbb counter start
ParseCommandLine(argc,argv);
// Start scheduler with given number of threads.
std::cout << threads << std::endl;
for(int p=threads.first; p<=threads.last; ++p) {
tbb::tick_count t0 = tbb::tick_count::now(); //timer
tbb::task_scheduler_init init(4); //creates P number of threads
srand(2); //generates a random number between 0-2?
size_t root_set_size = 0;
{
//this is the graph part of the code
Graph g;
g.create_random_dag(nodes);
std::vector<Cell*> root_set;
g.get_root_set(root_set);
root_set_size = root_set.size();
for(unsigned int trial=0; trial<traversals; ++trial) {
ParallelPreorderTraversal(root_set);
}
}
tbb::tick_count::interval_t interval = tbb::tick_count::now()-t0; //counter done
if (!SilentFlag){ //output the results
std::cout
<<interval.seconds()<<" seconds using "<<p<<" threads ("<<root_set_size<<" nodes in root_set)\n";
}
}
utility::report_elapsed_time((tbb::tick_count::now()-main_start).seconds());
return 0;
}catch(std::exception& e){
std::cerr
<< "unexpected error occurred. \n"
<< "error description: "<<e.what()<<std::endl;
return -1;
}
}
http://en.wikibooks.org/wiki/C%2B%2B_Programming/Scope/Examples - específicamente la sección "// Scope Programme complicado" – WernerCD