Ich lerne C++ und habe das in keinem der Bücher, die ich gelesen habe, wirklich gesehen. Ich wollte Code lesen und kommentieren, damit ich besser lernen kann und auf einen seltsamen Codeabschnitt gestoßen bin, der ausgeführt wird, aber keine Bedingung hat. Von dem was ich lese (und von meinen Erfahrungen mit anderen Sprachen, brauchst du ein if, while, for oder sowas für Blöcke).Versteht diesen Code nicht (er läuft ohne Bedingung)
Ich bin auf der tbb Themen Paket suchen, so bin ich nicht sicher, ob es im Zusammenhang mit dem Starten von Threads oder C++ spezifisch (wenn Sie dies nicht als etwas in C++ üblich dann seine wahrscheinlich tdd spezifischen).
Ich denke, ich verstehe, was der Code im Inneren tatsächlich tut, aber ich bin mir nicht sicher, wie es ausgelöst wird oder lief. Irgendwelche Ideen?
Hier ist der Abschnitt:
{
//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. Wenn es hier hilft, ist die gesamte Datei (der obige Code ist in der Mitte der Haupt()).
#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 - speziell der "// Komplizierte Umfang Programm" Abschnitt – WernerCD