
Harling, Torsten wrote: [...]
Now try including the ace header first (only the order of the include files is changed): ------------------------------------------------------------ #include <ace/OS.h> #include <boost/shared_ptr.hpp> #include <iostream>
using namespace std;
int main (int argc, char **argv) { cout << "sizeof (boost::detail::sp_counted_base) == " << sizeof (boost::detail::sp_counted_base) << endl; } ------------------------------------------------------------
The output of the second program is: sizeof (boost::detail::sp_counted_base) == 36
A great difference. The reason for this is, that the #include <ace/OS.h> somehow defines _REENTRANT, which triggers the boost library to include a mutex in sp_counted_base. I think, the order of the includes should not matter. Therefore, either '#include <ace/OS.h>' should not define _REENTRANT, or the boost headers should ignore it.
I found out, that adding the -pthread option to the g++ command also avoids this bug.
If you compile #include <boost/shared_ptr.hpp> #include <iostream> using namespace std; int main (int argc, char **argv) { cout << "sizeof (boost::detail::sp_counted_base) == " << sizeof (boost::detail::sp_counted_base) << endl; } (same program without the ACE include) you'll probably get the expected outcome of 12 when -pthread isn't used and 36 when -pthread is used. This is likely caused by g++ -pthread defining _REENTRANT, which is then used by boost/config.hpp to enable threading support. Since <boost/shared_ptr.hpp> doesn't know whether you're going to include an ACE header afterwards, it has to decide whether to include a mutex based on the present settings. If we make it ignore _REENTRANT, the above program will revert to single-threaded mode even when -pthread is used, and this is likely to break code. The only practical solution seems to be to consistently use -pthread with ACE, as I don't expect the ACE headers to stop defining _REENTRANT. They probably have their own reasons for that and they don't need to support single-threaded code.