Dear all,
I must be doing something wrong, but I can't figure out what. I would
appreciate some help. Thank you in advance.
The following program:
#include
void threadEntry()
{
}
int main (int argc, char *argv[])
{
for(size_t t=0; t<10; t++) {
boost::thread(threadEntry);
}
}
runs cleanly with valgrind drd, but this other program produces race
conditions when run with valgrind drd (see below). The only difference
is "new".
#include
void threadEntry()
{
}
int main (int argc, char *argv[])
{
for(size_t t=0; t<10; t++) {
new boost::thread(threadEntry);
}
}
This problem is not due to the leak, because this other program:
#include
#include
void threadEntry()
{
}
int main (int argc, char *argv[])
{
std::vectorboost::thread > threads;
for(size_t t=0; t<10; t++) {
boost::shared_ptrboost::thread thread(new boost::thread( threadEntry ));
threads.push_back(thread);
}
for (size_t i = 0; i < threads.size(); ++i) {
threads[i]->join();
}
}
which properly manages the heap also produces the same race conditions.
I compile using:
g++ -g -L /opt/boost/boost/stage/lib -lboost_thread threads.cpp
and I test the program using valgrind using:
valgrind --tool=drd ./a.out
The output of valgrind is:
==3822== drd, a thread error detector
==3822== Copyright (C) 2006-2009, and GNU GPL'd, by Bart Van Assche.
==3822== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for
copyright info
==3822== Command: ./a.out
==3822==
==3822== Thread 3:
==3822== Conflicting store by thread 3 at 0x0504b350 size 8
==3822== at 0x4E417B3: ??? (in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E41B28:
boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E42124: thread_proxy (in
/usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4C32870: vgDrd_thread_wrapper (drd_pthread_intercepts.c:272)
==3822== by 0x5D74A03: start_thread (pthread_create.c:300)
==3822== by 0x58D680C: clone (clone.S:112)
==3822== Allocation context: BSS section of
/usr/local/lib/libboost_thread.so.1.42.0
==3822== Other segment start (thread 2)
==3822== at 0x58D67D1: clone (clone.S:84)
==3822== by 0x5D7493F: ??? (allocatestack.c:743)
==3822== by 0x6B8A90F: ???
==3822== Other segment end (thread 2)
==3822== at 0x5D7A7C4: pthread_once (pthread_once.S:119)
==3822== by 0x4C28ADD: pthread_once (drd_pthread_intercepts.c:518)
==3822== by 0x4E473B3: boost::detail::get_once_per_thread_epoch()
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E4172F: ??? (in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E41B28:
boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E42124: thread_proxy (in
/usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4C32870: vgDrd_thread_wrapper (drd_pthread_intercepts.c:272)
==3822== by 0x5D74A03: start_thread (pthread_create.c:300)
==3822== by 0x58D680C: clone (clone.S:112)
==3822==
==3822== Conflicting store by thread 3 at 0x0504b350 size 8
==3822== at 0x4E417F9: ??? (in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E41B28:
boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E42124: thread_proxy (in
/usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4C32870: vgDrd_thread_wrapper (drd_pthread_intercepts.c:272)
==3822== by 0x5D74A03: start_thread (pthread_create.c:300)
==3822== by 0x58D680C: clone (clone.S:112)
==3822== Allocation context: BSS section of
/usr/local/lib/libboost_thread.so.1.42.0
==3822== Other segment start (thread 2)
==3822== at 0x58D67D1: clone (clone.S:84)
==3822== by 0x5D7493F: ??? (allocatestack.c:743)
==3822== by 0x6B8A90F: ???
==3822== Other segment end (thread 2)
==3822== at 0x5D7A7C4: pthread_once (pthread_once.S:119)
==3822== by 0x4C28ADD: pthread_once (drd_pthread_intercepts.c:518)
==3822== by 0x4E473B3: boost::detail::get_once_per_thread_epoch()
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E4172F: ??? (in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E41B28:
boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E42124: thread_proxy (in
/usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4C32870: vgDrd_thread_wrapper (drd_pthread_intercepts.c:272)
==3822== by 0x5D74A03: start_thread (pthread_create.c:300)
==3822== by 0x58D680C: clone (clone.S:112)
==3822== Other segment start (thread 2)
==3822== at 0x58D67D1: clone (clone.S:84)
==3822== by 0x5D7493F: ??? (allocatestack.c:743)
==3822== by 0x6B8A90F: ???
==3822== Other segment end (thread 2)
==3822== at 0x5D7A7C4: pthread_once (pthread_once.S:119)
==3822== by 0x4C28ADD: pthread_once (drd_pthread_intercepts.c:518)
==3822== by 0x4E473B3: boost::detail::get_once_per_thread_epoch()
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E4172F: ??? (in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E41B28:
boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E42124: thread_proxy (in
/usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4C32870: vgDrd_thread_wrapper (drd_pthread_intercepts.c:272)
==3822== by 0x5D74A03: start_thread (pthread_create.c:300)
==3822== by 0x58D680C: clone (clone.S:112)
==3822==
==3822== Conflicting load by thread 3 at 0x05f85288 size 8
==3822== at 0x5D73AEE: __nptl_deallocate_tsd (pthread_create.c:153)
==3822== by 0x5D74A11: start_thread (pthread_create.c:307)
==3822== by 0x58D680C: clone (clone.S:112)
==3822== Allocation context: BSS section of /lib/libpthread-2.10.1.so
==3822== Other segment start (thread 2)
==3822== at 0x58D67D1: clone (clone.S:84)
==3822== by 0x5D7493F: ??? (allocatestack.c:743)
==3822== by 0x6B8A90F: ???
==3822== Other segment end (thread 2)
==3822== at 0x5D7A7C4: pthread_once (pthread_once.S:119)
==3822== by 0x4C28ADD: pthread_once (drd_pthread_intercepts.c:518)
==3822== by 0x4E473B3: boost::detail::get_once_per_thread_epoch()
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E4172F: ??? (in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E41B28:
boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E42124: thread_proxy (in
/usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4C32870: vgDrd_thread_wrapper (drd_pthread_intercepts.c:272)
==3822== by 0x5D74A03: start_thread (pthread_create.c:300)
==3822== by 0x58D680C: clone (clone.S:112)
==3822==
==3822== Thread 4:
==3822== Conflicting load by thread 4 at 0x0504b350 size 8
==3822== at 0x4E41724: ??? (in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E41B28:
boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
(in /usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4E42124: thread_proxy (in
/usr/local/lib/libboost_thread.so.1.42.0)
==3822== by 0x4C32870: vgDrd_thread_wrapper (drd_pthread_intercepts.c:272)
==3822== by 0x5D74A03: start_thread (pthread_create.c:300)
==3822== by 0x58D680C: clone (clone.S:112)
==3822== Allocation context: BSS section of
/usr/local/lib/libboost_thread.so.1.42.0
==3822== Other segment start (thread 3)
==3822== (thread finished, call stack no longer available)
==3822== Other segment end (thread 3)
==3822== (thread finished, call stack no longer available)
==3822== Other segment start (thread 3)
==3822== (thread finished, call stack no longer available)
==3822== Other segment end (thread 3)
==3822== (thread finished, call stack no longer available)
==3822==
==3822==
==3822== For counts of detected and suppressed errors, rerun with: -v
==3822== ERROR SUMMARY: 11 errors from 4 contexts (suppressed: 126 from 76)