logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog

follow us in feedly

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 | e-mail | 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

Algo a dizer?
Nome:


Site:


E-mail:


Escreva o número vinte e seis:


 Não mostre meu e-mail no site, não serve pra nada mesmo...

Comentário





Os comentários devem ser sobre assuntos relativos ao post, eu provavelmente apagarei comentários totalmente offtopic. Se quiser me enviar uma mensagem, use o formulário de contato. E não esqueça: isso é um site pessoal e eu me reservo o direito de apagar qualquer comentário ofensivo ou inapropriado.
rebarba rebarba
  ::::