Hello, I'm Severin Lemaignan, software engineer at the INRIA french public research center. We are working on automation in public transportation. All our project is currently a pretty big C++/CLI-based piece of software, and we are relying more and more on Boost for low-level operations like threading. We ran very recently into a problem with Boost mutexes: We compile the project with Visual Studio 2005 (with the /clr flag), and everything was fine until we (re-)enabled precompiled headers. After that, the program still compiled and linked but it crashed as soon as started with a 0xc000007b error (namely "The application failed to initialize properly"). After futher investigation, we discovered it's due to the way we use "#pragma unmanaged" and "#pragma managed". The Boost headers were simply included in a "managed" part of the code while Boost methods (especially mutexes) were called in a "unmanaged" part. Hence causing the crash. The Boost library never complained at compile time. Maybe it should detect inconsistent use of managed/unmanaged pragma and warn the user ? We found another pratical (but unexpected) solution to the issue: instanciate a Boost::thread before the mutex. It solved the run-time crash. If someone has an explaination... Best regards, Séverin Lemaignan
Séverin Lemaignan
The Boost library never complained at compile time. Maybe it should detect inconsistent use of managed/unmanaged pragma and warn the user ?
Many (perhaps most) Boosters are not familiar with C++/CLI. Can you post a patch that will achieve this result to the SourceForge patch tracker? Thanks, -- Dave Abrahams Boost Consulting www.boost-consulting.com
Séverin Lemaignan wrote:
Hello,
I'm Severin Lemaignan, software engineer at the INRIA french public research center. We are working on automation in public transportation. All our project is currently a pretty big C++/CLI-based piece of software, and we are relying more and more on Boost for low-level operations like threading.
We ran very recently into a problem with Boost mutexes:
We compile the project with Visual Studio 2005 (with the /clr flag), and everything was fine until we (re-)enabled precompiled headers.
After that, the program still compiled and linked but it crashed as soon as started with a 0xc000007b error (namely "The application failed to initialize properly").
After futher investigation, we discovered it's due to the way we use "#pragma unmanaged" and "#pragma managed". The Boost headers were simply included in a "managed" part of the code while Boost methods (especially mutexes) were called in a "unmanaged" part. Hence causing the crash.
I have not used the Boost threading library but I have done much C++/CLI programming.
The Boost library never complained at compile time. Maybe it should detect inconsistent use of managed/unmanaged pragma and warn the user ?
How would it do this ? It can know whether the _MANAGED preprocessor define is defined or not in a particular usage, but it can not know between one use of it or another whether _MANAGED is being defined or not, and somehow report an error if it s not. I think it is up to the user to make sure that code using a library is defined as managed or unmanaged consistently in a C++/CLI module. Generally in a C++/CLI module, the code is always being compiled as managed code, even when it is a C++ class as opposed to a ref class. if you are manually controlling this by using the "#pragma unmanaged" and "#pragma managed" directives, then it would seem to me that it is up to you to determine this being used consistently.
participants (3)
-
David Abrahams
-
Edward Diener
-
Séverin Lemaignan