Para resolver o Google Treasure Hunt 2, decidi usar um velho programa para busca de arquivos implementado em C++ usando multi-threading. Eu mudei algumas partes do codigo, so para garantir que possa fazer a busca pelos 2 padroes especificados no problema, e escolhi usar o framework Qt (da Trolltech) que tem algumas funcoes muito legais para lidar com arquivos, e isso e realmente verdade voce nao precisa de mais nada, a nao ser as classes QFile e QDir e derivadas delas. Se voce gosta de programacao distribuida, talvez voce ja tenha ouvido falar no modelo MapReduce, desenvolvido pela Google (www.google.com). De acordo com Jeffrey Dean e Sanjay Ghemawat, em um artigo (Distributed Programming with MapReduce) escrito para o interessante livro Beautiful Code (OReilly, 2007), MapReduce was developed as a way of simplifying the development of large-scale computations at Google. (traducao: O MapReduce foi desenvolvido como uma forma de simplicar o desenvolvimento de processamento em larga-escala no Google) Acredito que esse problema proposto no Google Treasure Hunt nao seja realmente um processamento em larga-escala, mas eu gostei da forma como o MapReduce funciona, e decidi aplicar esse conceito ao meu programa.Aqui esta o problema numero 2 do Google Treasure Hunt: Here is a random zip archive for you to download: GoogleTreasureHunt08_14338682343771558225.zipUnzip the archive, then process the resulting files to obtain a numeric result. You'll be taking the sum of lines from files matching a certain description, and multiplying those sums together to obtain a final result. Note that files have many different extensions, like '.pdf' and '.js', but all are plain text files containing a small number of lines of text.Sum of line 4 for all files with path or name containing BCD and ending in .jsSum of line 5 for all files with path or name containing foo and ending in .xmlHint: If the requested line does not exist, do not increment the sum.Multiply all the above sums together and enter the product below.(Note: Answer must be an exact, decimal representation of the number.) Se voce der uma olhada no codigo fonte, existem 2 threads; o primeiro (Mapper) obtem a lista de arquivos com um padrao de nomes fornecido (no meu caso, nomes contendo BCD e com extensao .js, ou contendo foo e terminando com .xml); o segundo thread (Reducer) utiliza a lista com nomes de arquivos do thread Mapper e faz uma outra busca mais profunda dentro de cada um dos arquivos pre-selecionados (para obter os valores de numeros nas linhas de numero 4). O principal metodo do Mapper e o seguinte: bool FileSearchMap::depthFirstTraversal(const QString& currentDir) { QDir dirP(currentDir); QString temp; QString fileName; QStringList entryP = dirP.entryList(); QStringListIterator entryL(entryP); while (entryL.hasNext()) { producerMutex.lock(); if (myFileCount == 5) { bufferNotFull.wait(&producerMutex); } // if - mutex and signal producerMutex.unlock(); fileName.clear(); temp = entryL.next(); if ((temp != ".") && (temp != "..")) { fileName = currentDir; fileName.append('\\'); fileName.append(temp); if (isDirectory(fileName)) { depthFirstTraversal(fileName); } else { if (isRegular(fileName)) { unsigned int ftype = 0; if ( ( fileName.endsWith(".js") ) && ( fileName.contains("BCD") ) ) ftype = TXT_FILE_PATTERN; else if ( ( fileName.endsWith(".xml") ) && (