Hello
I am trying to model a usecase where
a member function reads in a value & now has to modify the value by
calling another function. The code which I have written using upgrade_locks
fails at run time. I have gone through the documentation & have cleared
the code as best as I could to arrive at a condensed usecase. I have also
attached some sample erroneous outputs & a backtrace of the thread
in question. Can someone please have a look?
Linux architecture_233 2.6.18-128.el5
#1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux
GNU C Library stable release version
2.5, by Roland McGrath et al.
Compiled by GNU CC version 4.1.2 20080704
(Red Hat 4.1.2-44).
Compiled on a Linux 2.6.9 system on
2009-01-05.
Available extensions:
The C stubs
add-on version 2.1.2.
crypt
add-on version 2.1 by Michael Glad and others
GNU
Libidn by Simon Josefsson
GNU
libio by Per Bothner
NIS(YP)/NIS+
NSS modules 0.19 by Thorsten Kukuk
Native
POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
RT
using linux kernel aio
Thread-local storage support included.
#include <iostream>
#include <boost/thread.hpp>
class boostThreadLocksTest
{
public:
boost::shared_mutex myMutex;
boost::upgrade_lock<boost::shared_mutex> myLock;
static int firstFunction(boostThreadLocksTest *pBoostThreadLocksTest);
static int secondFunction(boostThreadLocksTest *pBoostThreadLocksTest);
boostThreadLocksTest():myMutex(),myLock(myMutex,boost::defer_lock_t()){};
};
int boostThreadLocksTest::firstFunction(boostThreadLocksTest
*pBoostThreadLocksTest)
{
std::cout<<"Before
Locking "<<boost::this_thread::get_id()<<"
"<<__PRETTY_FUNCTION__<<std::endl;
pBoostThreadLocksTest->myLock.lock();
std::cout<<"After
Locking "<<boost::this_thread::get_id()<<"
"<<__PRETTY_FUNCTION__<<std::endl;
pBoostThreadLocksTest->secondFunction(pBoostThreadLocksTest);
std::cout<<"Returned
>From Call "<<boost::this_thread::get_id()<<"
"<<__PRETTY_FUNCTION__<<std::endl;
pBoostThreadLocksTest->myLock.unlock();
std::cout<<"After
Unlocking "<<boost::this_thread::get_id()<<"
"<<__PRETTY_FUNCTION__<<std::endl;
return(0);
}
int boostThreadLocksTest::secondFunction(boostThreadLocksTest
*pBoostThreadLocksTest)
{
std::cout<<"Before
Exclusive Locking "<<boost::this_thread::get_id()<<"
"<<__PRETTY_FUNCTION__<<std::endl;
boost::upgrade_to_unique_lock<boost::shared_mutex>
localUniqueLock(pBoostThreadLocksTest->myLock);
std::cout<<"After
Exclusive Locking "<<boost::this_thread::get_id()<<"
"<<__PRETTY_FUNCTION__<<std::endl;
return(0);
}
int main()
{
boostThreadLocksTest
myObject;
boost::thread_group
myThreadGroup;
myThreadGroup.create_thread(boost::bind(boostThreadLocksTest::firstFunction,&myObject));
myThreadGroup.create_thread(boost::bind(boostThreadLocksTest::firstFunction,&myObject));
myThreadGroup.create_thread(boost::bind(boostThreadLocksTest::firstFunction,&myObject));
myThreadGroup.join_all();
}
Before Locking
0x7694120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
After Locking
0x7694120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Before Exclusive Locking 0x7694120 static
int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
After Exclusive Locking 0x7694120
static int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
Returned From Call
0x7694120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
After Unlocking
0x7694120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Before Locking
0x76943e0 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
After Locking
0x76943e0 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Before Exclusive Locking 0x76943e0 static
int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
After Exclusive Locking 0x76943e0
static int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
Before Locking
0x76946e0 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Returned From Call
0x76943e0 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
terminate called after throwing an instance
of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error>
>'
what(): boost::lock_error
Aborted
Before Locking
0x1888e120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
After Locking
0x1888e120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Before Exclusive Locking 0x1888e120
static int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
After Exclusive Locking 0x1888e120
static int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
Before Locking
0x1888e3e0 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Returned From Call
0x1888e120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
terminate called after throwing an instance
of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error>
>'
what(): boost::lock_error
Returned From Call
0x1888e120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Aborted
Before Locking
0x18f62120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
After Locking
0x18f62120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Before Exclusive Locking 0x18f62120
static int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
After Exclusive Locking 0x18f62120
static int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
Before Locking
0x18f623e0 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Returned From Call
0x18f62120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
terminate called after throwing an instance
of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error>
>'
what(): boost::lock_error
Returned From Call
0x18f62120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Aborted
Before Locking
0x1a2a1120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
After Locking
0x1a2a1120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Before Exclusive Locking 0x1a2a1120
static int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
After Exclusive Locking 0x1a2a1120
static int boostThreadLocksTest::secondFunction(boostThreadLocksTest*)
Before Locking
0x1a2a13e0 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Returned From Call
0x1a2a1120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
terminate called after throwing an instance
of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error>
>'
what(): boost::lock_error
Returned From Call
0x1a2a1120 static int boostThreadLocksTest::firstFunction(boostThreadLocksTest*)
Aborted
Program terminated with signal 6, Aborted.
[New process 9574]
[New process 9573]
[New process 9571]
#0 0x00000039f8430215 in raise
() from /lib64/libc.so.6
(gdb) bt
#0 0x00000039f8430215 in raise
() from /lib64/libc.so.6
#1 0x00000039f8431cc0 in abort
() from /lib64/libc.so.6
#2 0x00000039fa0bec44 in __gnu_cxx::__verbose_terminate_handler
() from /usr/lib64/libstdc++.so.6
#3 0x00000039fa0bcdb6 in ?? ()
from /usr/lib64/libstdc++.so.6
#4 0x00000039fa0bcde3 in std::terminate
() from /usr/lib64/libstdc++.so.6
#5 0x00000039fa0bceca in __cxa_throw
() from /usr/lib64/libstdc++.so.6
#6 0x00000000004108cf in boost::throw_exception<boost::lock_error>
()
#7 0x000000000041a1a0 in boost::upgrade_lock<boost::shared_mutex>::lock
()
#8 0x0000000000405e19 in boostThreadLocksTest::firstFunction
()
#9 0x0000000000409c36 in boost::_bi::list1<boost::_bi::value<boostThreadLocksTest*>
>::operator()<int, int (*)(boostThreadLocksTest*), boost::_bi::list0>
()
#10 0x0000000000409c74 in boost::_bi::bind_t<int,
int (*)(boostThreadLocksTest*), boost::_bi::list1<boost::_bi::value<boostThreadLocksTest*>
> >::operator() ()
#11 0x0000000000409c92 in boost::detail::thread_data<boost::_bi::bind_t<int,
int (*)(boostThreadLocksTest*), boost::_bi::list1<boost::_bi::value<boostThreadLocksTest*>
> > >::run ()
#12 0x00002b627c120bbb in thread_proxy
() from /usr/local/lib/libboost_thread.so.1.43.0
#13 0x00000039f9006367 in start_thread
() from /lib64/libpthread.so.0
#14 0x00000039f84d30ad in clone () from
/lib64/libc.so.6
#0 0x00000039f84c56db in write
() from /lib64/libc.so.6
#1 0x00000039f846ba63 in _IO_new_file_write
() from /lib64/libc.so.6
#2 0x00000039f846b976 in _IO_new_do_write
() from /lib64/libc.so.6
#3 0x00000039f846c0f4 in _IO_new_file_overflow
() from /lib64/libc.so.6
#4 0x00000039f8469286 in putc
() from /lib64/libc.so.6
#5 0x00000039fa08ff2f in std::ostream::put
() from /usr/lib64/libstdc++.so.6
#6 0x00000039fa090010 in std::endl<char,
std::char_traits<char> > () from /usr/lib64/libstdc++.so.6
#7 0x0000000000405d4a in boostThreadLocksTest::secondFunction
()
#8 0x0000000000405e9b in boostThreadLocksTest::firstFunction
()
#9 0x0000000000409c36 in boost::_bi::list1<boost::_bi::value<boostThreadLocksTest*>
>::operator()<int, int (*)(boostThreadLocksTest*), boost::_bi::list0>
()
#10 0x0000000000409c74 in boost::_bi::bind_t<int,
int (*)(boostThreadLocksTest*), boost::_bi::list1<boost::_bi::value<boostThreadLocksTest*>
> >::operator() () #11 0x0000000000409c92 in boost::detail::thread_data<boost::_bi::bind_t<int,
int (*)(boostThreadLocksTest*), boost::_bi::list1<boost::_bi::value<boostThreadLocksTest*>
> > >::run ()
#12 0x00002b627c120bbb in thread_proxy
() from /usr/local/lib/libboost_thread.so.1.43.0
#13 0x00000039f9006367 in start_thread
() from /lib64/libpthread.so.0
#14 0x00000039f84d30ad in clone () from
/lib64/libc.so.6
#0 0x00000039f900a899 in pthread_cond_wait@@GLIBC_2.3.2
() from /lib64/libpthread.so.0
#1 0x00002b627c1224e7 in boost::thread::join
() from /usr/local/lib/libboost_thread.so.1.43.0
#2 0x000000000041aa47 in boost::thread_group::join_all
()
#3 0x0000000000405be3 in main
()
Disclaimer note on content of this message including enclosure(s)and
attachments(s): The contents of this e-mail are the privileged and
confidential material of National Stock Exchange of India Limited
(NSE). The information is solely intended for the individual/entity
it is addressed to. If you are not the intended recipient of this
message, please be aware that you are not authorized in any which
way whatsoever to read, forward, print, retain, copy or disseminate
this message or any part of it. If you have received this e-mail in
error, we would request you to please notify the sender immediately
by return e-mail and delete it from your computer. This e-mail
message including attachment(s), if any, is believed to be free of
any virus and NSE is not responsible for any loss or damage arising
in any way from its use.