logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog


A volta dos que foram mas voltaram logo

Algumas notícias importantes para movimentar meu quase abandonado site enquanto eu fico pensando em uma boa desculpa para essa situação:

  • Voltei para São Paulo, e conseqüentemente, estou quase toda terça degustando um chopp no Bar Barão. Sim, isso é um convite. Para todos.
  • O seminário da Tempo Real sobre Portabilidade e Performance foi muito bom, muito bom mesmo. Parabéns a todos nós do "C/C++ Brasil" por fazermos eventos com qualidade técnica tão alta, coisa que eu nunca vi nessas bandas. Fico feliz por poder compartilhar o que eu aprendi em incontáveis horas programando, dezenas de livros e outras dezenas de sites e artigos lidos. E fico muito mais feliz em poder aprender com pessoas que percorreram esse mesmo caminho, muitos que estudaram e leram muito mais do que eu. Eu sei que sou bom nesse negócio de programação (modéstia é um defeito que eu não tenho), mas minha vontade de aprender ainda é bem maior que meu ego. É **muito** bom conhecer e compartilhar conhecimento com gente que é melhor do que eu. Parabéns e obrigado a todos.
  • Depois de mais de um mês offline (sim, essa é a desculpa), segue aqui a apresentação usada na minha palestra "Portabilidade via STL e Boost", onde eu fiz pelo STL e Boost o que os palestrantes da Microsoft/Sun/IBM/etc costumam fazer pelas empresas que pagam seus salários:



Como um trecho de código vale mais do que uma apresentação cheia de piadinhas não-tão-engraçadas, segue o dito cujo que usei durante a demo da palestra:


#define _CRT_SECURE_NO_WARNINGS
#define _SCL_SECURE_NO_WARNINGS
 
#include <vector>
#include <string>

#include <sstream>
 
#include <iostream>
 
 
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/function.hpp>
#include <boost/array.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/shared_array.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/ptr_container/ptr_map.hpp>
#include <boost/ptr_container/ptr_set.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/format.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
 
#include <boost/program_options.hpp>
 
#include <boost/tuple/tuple.hpp>
 
#include <boost/foreach.hpp>
 
#include "boost/filesystem.hpp" 
#include <iostream>          
 
using namespace std;
using boost::lexical_cast;
using boost::format;
using boost::shared_ptr;
 
boost::mutex log_mutex;
 
void Log(int level, const string& str)
{
	boost::mutex::scoped_lock l(log_mutex);
 
	cout << 
		boost::format("%d - %s") % level % str
		<< endl;
}
 
 
void f(int level, string s1, string s2)
{
	Log(level, s1 + string(" ") + s2);
}
 
typedef vector<shared_ptr<boost::thread> > UmVectorDeThreads;
 
UmVectorDeThreads Test_Threads()
{
#if 0
	boost::array<boost::thread, 32> threads;
	threads.at(2) = boost::thread(boost::bind(&f, "Eu programa aos sábados.", "E daí"));

#endif
 
	boost::array< shared_ptr<boost::thread>, 32> threads;
 
	for(unsigned int i = 0 ; i < threads.size() ; i++)
	{
		threads[i] = shared_ptr<boost::thread>(
			new boost::thread(
			boost::bind(&f, 2, "Eu programo aos sabados.", 
			lexical_cast<string>(i))));
	}
 
	//
	// ai...
	//
	for(boost::array< shared_ptr<boost::thread>, 32>::iterator i 
		= threads.begin() ; i != threads.end() ; ++i)
	{
 
	}
 
	BOOST_FOREACH(shared_ptr<boost::thread> t, threads)
	{
 
	}
 
	boost::thread t;
 
 
	UmVectorDeThreads threads2(threads.size());
 
	std::copy(threads.begin(), threads.end(), threads2.begin());
 
	return threads2;
}
 
void VamosEsperarAsThreads(UmVectorDeThreads& threads)
{
	BOOST_FOREACH(shared_ptr<boost::thread> t, threads)
	{
		t->join();
	}
}
 
void Test_FileSystem()
{
	using namespace boost::filesystem;          
	path p("c:\\temp\\abobrinha");
 
	for(path::iterator i = p.begin() ; i != p.end() ; ++i)
		cout << *i << endl;
}
 
 
void Test_STL()
{
	vector<string> v;
	list<string> l;
	map<int, string> m;
 
	for(int a = 0 ; a < 20 ; a++)
	{
		string nome = "Nome " + lexical_cast<string>(a);
		v.push_back(nome);
		m[a] = nome;
	}
 
	copy(v.begin(), v.end(), back_inserter(l));
 

	BOOST_FOREACH(const string& nome, v)
		cout << nome << endl;
 
	for_each(l.begin(), l.end(), boost::bind(&Log, 1, _1));
}
 
int main()
{
	UmVectorDeThreads threads = Test_Threads();
 
	Test_STL();
	Test_FileSystem();
 
	for_each(threads.begin(), threads.end(), 
		boost::bind(&boost::thread::join, _1));
 
	//
	// olha mamãe, sem desalocar memória
	//
	return 0;
}

Em 21/06/2008 21:42, por Rodrigo Strauss


  
 
 
Comentários
Guilherme Costa | em 23/06/2008 | #
Rodrigo,

Tive a mesma experiencia, mas no sentido contrario. Sai de Poa para SP, e voltei 8 meses depois!!

As experiencias sao boas, mas algumas vezes nao sao bem o que precisamos no momento.

E se pra ti é melhor estar em SP, e continuar nos alimentando de informacoes uteis! Seja bem vindo de volta!!


Grande abraco,
Guilherme Costa
Denis | em 11/07/2008 | #
Estou com os seguintes erros ao compilar seu exemplo:
C:\PROGRAM FILES\BOOST\BOOST_1_35_0\boost/thread/win32/basic_timed_mutex.hpp(69) : error C2668: 'timed_lock' : ambiguous call to overloaded function
C:\PROGRAM FILES\BOOST\BOOST_1_35_0\boost/thread/locks.hpp(22) : error C2059: syntax error : '}'
C:\PROGRAM FILES\BOOST\BOOST_1_35_0\boost/thread/locks.hpp(22) : error C2143: syntax error : missing ';' before '}'
C:\PROGRAM FILES\BOOST\BOOST_1_35_0\boost/thread/locks.hpp(23) : error C2146: syntax error : missing ';' before identifier 'try_to_lock'
C:\PROGRAM FILES\BOOST\BOOST_1_35_0\boost/thread/locks.hpp(23) : error C2734: 'try_to_lock_t' : const object must be initialized if not extern
C:\PROGRAM FILES\BOOST\BOOST_1_35_0\boost/thread/locks.hpp(23) : fatal error C1004: unexpected end of file found

Se puder ajudar agradeço.
Obrigado
Rodrigo Strauss | website | em 14/07/2008 | #
O fonte estava com problemas, tente novamente com essa atualização.
Denis | em 16/07/2008 | #
Continuo com o mesmo erro, estou usando o Boost no Visual C++ 6, será q é isso, instalei de novo para ver se tinha algum erro. Usei a instalação completa.
A linha do erro no boost é essa em basic_timed_mutex.hpp:
void lock()
{
BOOST_VERIFY(timed_lock(::boost::detail::get_system_time_sentinel()));
}

e essas aqui em lock.hpp:
const defer_lock_t defer_lock={};
const try_to_lock_t try_to_lock={};
const adopt_lock_t adopt_lock={};

Outra coisa, estou logado como usuario normal no Windows.

obrigado
Rodrigo Strauss | website | em 16/07/2008 | #
O Boost 1.35 não funciona com o Visual C++ 6.0. Apesar de eles dizerem que as versões anteriores funcionam, eu não tive boas experiências com isso. Tente usar o Visual C++ Express.
Denis | em 16/07/2008 | #
Realmente algumas coisas até funcionam no VC6, como regex, tuple, asio etc. Testei seu exemplo no gcc e compilou corretamente. Muito bom seu exemplo, otimo para testar threads. Estava usando para sincronizar threads.
obrigado
Alexandre Tarifa | website | em 27/08/2008 | #
Rodrigão, faz tempo que não acontece o chopp eim! vamos marcar.

[]'s

rebarba rebarba
  ::::