Instead of this:
tr1::bind(&f1, data);
You need this:
tr1::bind(&f1, tr1::ref(data));
Boost has the same thing: boost::ref() must be used inside boost::bind() if you want the bound function object to store a reference to the data. Otherwise, the data will always be copied into the bound function object produced by bind().