
Vaclav, It was not clear in your original post that the mutex was created from main. Since you have identified that it is an internal mutex in boost::thread that triggers the issue I suggest altering either the construction time of the mutex in boost::thread or replacing the boost::mutex with a replacement mutex based upon an atomic integer. This would diagnose the problem definitively. I would do this myself, but I have never experienced the problem since Borland C++ is not one of my compilers that I use. I hope this helps pinpoint the problem. Regards, Neil Groves -----Original Message----- From: boost-bounces@lists.boost.org [mailto:boost-bounces@lists.boost.org] On Behalf Of Vaclav Cechura Sent: 24 November 2007 11:47 To: boost@lists.boost.org Subject: Re: [boost] FW: [Boost-users] [threads] Using boost::mutexraises access violation exception As I wrote in my post, I tried to allocate the mutex in main using "new" but it did not helped. And the cause seems to be in the thread initialization process long before my mutex is used. Actually the mutex that causes the crash is an mutex object that boost::thread creates during startup. Vaclav -----Original Message----- From: boost-bounces@lists.boost.org [mailto:boost-bounces@lists.boost.org] On Behalf Of Neil Groves Sent: Saturday, November 24, 2007 11:41 AM To: boost@lists.boost.org Subject: Re: [boost] FW: [Boost-users] [threads] Using boost::mutexraises access violation exception I have experienced a similar issue with boost::mutex when the mutex was instantiated from DllMain (in a DLL). The Windows implementation uses a Critical Section. I have found that under many startup / shutdown cases the InitializeCriticalSection returns null. I cannot find documentation that states that this happens. The solution is to create the boost::mutex in another manner. Hence if you stop the boost::mutex from being a global variable I think the problem will disappear. I hope this helps, Neil Groves -----Original Message----- From: boost-bounces@lists.boost.org [mailto:boost-bounces@lists.boost.org] On Behalf Of v2cechura Sent: 23 November 2007 14:31 To: boost@lists.boost.org Subject: [boost] FW: [Boost-users] [threads] Using boost::mutex raises access violation exception I posted this to the user's list (no answer till now), but later came to the conclusion that developer's list might be a better place. Any help on th issue appreciated. Vaclav -----Original Post------ I just recently installed and built boost library (1.34.1) using bcbboost. I wanted to try the boost::thread class. This simple code gives me "Access Violation" in Borland C++ Builder 2006 when boost::mutex is used: //-------------------------------------------------------------------------- - #include <iostream> #include <boost/thread.hpp> //-------------------------------------------------------------------------- - boost::xtime xt = {2}; boost::mutex console; // line A void thr() // int n, boost::mutex & display { for (int i = 0; i < 10; i++) { { boost::mutex::scoped_lock l(console); // line B std::cout << "thr" << 1 << ":" << i << std::endl; } boost::thread::sleep(xt); } // end for } int main(int argc, char* argv[]) { boost::thread_group tg; tg.create_thread(&thr); char c; std::cin >> c ; return 0; } If line A and line B are commented-out then the error is gone. The project is a multithreaded console application, both boost.threads and rtl are static-linked. Caller stack is: :7c812a5b kernel32.RaiseException + 0x52 :004129aa ___raiseDebuggerException + 0x1A :00412a84 ; ___raiseDebuggerException :7c9037bf ntdll.RtlConvertUlongToLargeInteger + 0x7a :7c90378b ntdll.RtlConvertUlongToLargeInteger + 0x46 :7c90eafa ntdll.KiUserExceptionDispatcher + 0xe :0041FA2B boost::mutex::do_unlock(this=NULL, =:0012FDE8) :0041E3A2 boost::detail::thread::lock_ops<boost::mutex>::unlock(m=NULL, state=:0012FDE8) :0041E12D boost::condition::do_wait<boost::mutex>(this=:0012FEA4, mutex=NULL) :0041DE2E boost::condition::wait<boost::detail::thread::scoped_lock<boost::mutex>
(this=:0012FEA4, lock=:0012FE5C) :0041D42F __UNNS__thread_01c827c2c2c9169a::thread_param::wait(this=:0012FE9C) :0041D201 boost::thread::thread(this=:00000FCC, threadfunc=:00000FC8) :00000001 :0012fe01
I put mutex.cpp in my directory and BCB2006 locates the error to be here: void mutex::do_unlock() { if (m_critical_section) //------------- Access violation HERE release_critical_section(m_mutex); else release_mutex(m_mutex); } The access violation is raised when thread::thread constructor is called. Looking at the caller stack I noticed that mutex parameter is NULL from some point and it results in this==NULL for the last call. Note that this mutex parameter is not the mutex "console" object I use in the program. It is a mutex that boost.threads library uses during thread initialization. On the other hand there is some dependance on mutex "console" because when I comment it out the error is gone. I maked console a pointer with appropriate changes to source and created it using new but it did not help. Am I missing something? Any help appreciated. Does anybody have experiences with boost::thread and mutex under BCB(2006,2007...)? Vaclav _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost