まことに申し訳ございません。std::cout はスレッドセーフでした。
変なマージのされ方をしていた原因は単にシングルスレッド用のライブラリをリンクしていたためでした。

とはいうものの
printf( "hoge %s\n", str );
 ↓
std::cout << "hoge " << str << std::endl;
では >>20 のご指摘通り printf では一回で出るものが std::cout では複数回になってしまうため
boost の format みたいなの作って何とかするか stdio.h を使い続けることにします。

どうもお騒がせしました。