|
Boost : |
Subject: [boost] [date_time] SIGSEGV in multithreaded code on Solaris Sparc
From: Roberto Gimenez (chilabot_at_[hidden])
Date: 2009-01-05 12:04:52
The following multithreaded code causes SIGSEGV in Solaris Sparc 10:
#include <boost/thread.hpp>
#include <sstream>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
using namespace boost;
void fun();
int main(int argc, char** argv)
{
thread t1(fun);
thread t2(fun);
pause();
return (EXIT_SUCCESS);
}
void fun()
{
while(true)
{
stringstream str;
str << posix_time::microsec_clock::local_time().time_of_day();
}
}
The stackstrace from the core dump is the following:
----------------- lwp# 1 / thread# 1 --------------------
ffffffff7ead3c50 _pause (ffffffff7ffff4e0, ffffffff7ee00200, 0,
ffffffff7ef08ba4, ffffffff7e300140, 0) + 8
0000000100015ea0 main (1, ffffffff7ffff5f8, ffffffff7ffff608, ffffffff7ea4aedc,
ffffffff7e3000c0, ffffffff7ee00200) + 58
000000010001589c _start (0, 0, 0, 0, 0, 0) + 17c
----------------- lwp# 2 / thread# 2 --------------------
ffffffff7ea3b670 strlen (ffffffff7e0fba38, 1001377c0, 1, ffffffff7f510d00, c,
ffffffff7f51d608) + 50
0000000100017c60
std::locale::locale<boost::date_time::time_facet<boost::posix_time::ptime,char,
std::ostreambuf_iterator<char,std::char_traits<char>> > >#Nvariant
1(const std::locale&,__type_0*) (ffffffff7e0fba38,
ffffffff7e0fba30, 1001362a0, 1061b4, ffffffff7f00ef70, 1) + 68
000000010001728c
std::basic_ostream<__type_0,__type_1>&boost::posix_time::operator<<<
char,std::char_traits<char>>(std::basic_ostream<__type_0,__type_1>&,const
boost::posix_time::time_duration&) (ffffffff7e0fbbb0, ffffffff7e0fbb90,
ffffffff7e0fbbb8, ffffffff7e0fbd08, ffffffff7f51a160, ffffffff7f510d00) + 22c
0000000100015f84 void fun() (ffffffff7f915528, 10012f920, 3, ffffffff7ee00b58,
18, 3) + 5c
0000000100020940 void boost::detail::thread_data<void(*)()>::run() (10012f920,
0, 158, 10af4c, 0, 0) + 10
ffffffff7f8095b4 thread_proxy (10012f920, 2, 10012de88, 10012f920, 3, 48) + 94
ffffffff7ead2e7c _lwp_start (0, 0, 0, 0, 0, 0)
----------------- lwp# 3 / thread# 3 --------------------
ffffffff7f3d3130 std::locale::~locale #Nvariant 1() (ffffffff7f915528,
1001311f0, 3, ffffffff7ee01358, 18, 3) + 8
0000000100020940 void boost::detail::thread_data<void(*)()>::run() (1001311f0,
0, 158, 10af4c, 0, 0) + 10
ffffffff7f8095b4 thread_proxy (1001311f0, 2, 10012df30, 1001311f0, 3, 5d) + 94
ffffffff7ead2e7c _lwp_start (0, 0, 0, 0, 0, 0)
When running with just one thread, it works fine. So it's a race condition
aparently.
The stacktrace varies. This is another one:
----------------- lwp# 1 / thread# 1 --------------------
ffffffff7ead3c50 _pause (ffffffff7ffff4e0, ffffffff7ee00200, 0,
ffffffff7ef08ba4, ffffffff7e300140, 0) + 8
0000000100015ea0 main (1, ffffffff7ffff5f8, ffffffff7ffff608,
ffffffff7ea4aedc, ffffffff7e3000c0, ffffffff7ee00200) + 58
000000010001589c _start (0, 0, 0, 0, 0, 0) + 17c
----------------- lwp# 2 / thread# 2 --------------------
ffffffff7f3d3130 std::locale::~locale #Nvariant 1()
(ffffffff7f915528, 10012f920, 3, ffffffff7ee00b58, 18, 3) + 8
0000000100020940 void boost::detail::thread_data<void(*)()>::run()
(10012f920, 0, 158, 10af4c, 0, 0) + 10
ffffffff7f8095b4 thread_proxy (10012f920, 2, 10012de88, 10012f920,
3, 48) + 94
ffffffff7ead2e7c _lwp_start (0, 0, 0, 0, 0, 0)
----------------- lwp# 3 / thread# 3 --------------------
000000010001e090 unsigned long boost::date_time::gregorian_calendar_base<
boost::date_time::year_month_day_base<boost::gregorian::greg_year,
boost::gregorian::greg_month,boost::gregorian::greg_day>,
unsigned long>::day_number(const boost::date_time::
year_month_day_base<boost::gregorian::greg_year,boost::gregorian::
greg_month,boost::gregorian::greg_day>&) (ffffffff7defb7c4,
7d9000000000000, 1000000000000, 5000000000000, 4, 7d9) + 1b8
000000010001b078 boost::date_time::date<boost::gregorian::date,
boost::gregorian::gregorian_calendar,boost::date_time::date_duration<
boost::date_time::duration_traits_adapted> >::date #Nvariant 1(
boost::gregorian::greg_year,boost::gregorian::greg_month,
boost::gregorian::greg_day) (ffffffff7defb9b0, 7d9000000000000,
1000000000000, 5000000000000, ffffffff7ebf6c38, ffffffff7defb9c0) + 98
000000010001a3a0 boost::gregorian::date::date #Nvariant 1(boost::gregorian::
greg_year,boost::gregorian::greg_month,boost::gregorian::greg_day)
(ffffffff7defb9b0, 7d9000000000000, 1000000000000, 5000000000000,
400, ffffffff7defb9f0) + 90
0000000100017a20 boost::posix_time::ptime boost::date_time::microsec_clock<
boost::posix_time::ptime>::create_time(boost::date_time::
microsec_clock<boost::posix_time::ptime>::TZ_FOR_CREATE)
(0, 1000, 6, 0, 198704, 18) + 128
000000010001749c boost::posix_time::ptime boost::date_time::microsec_clock<
boost::posix_time::ptime>::local_time() (ffffffff7defbba0, 18,
ffffffff7defbbb8, ffffffff7defbd08, ffffffff7f51a160,
ffffffff7f510d00) + c
0000000100015f40 void fun() (ffffffff7f915528, 1001311f0, 3,
ffffffff7ee01358, 18, 3) + 18
0000000100020940 void boost::detail::thread_data<void(*)()>::run()
(1001311f0, 0, 158, 10af4c, 0, 0) + 10
ffffffff7f8095b4 thread_proxy (1001311f0, 2, 10012df30, 1001311f0,
3, 5d) + 94
ffffffff7ead2e7c _lwp_start (0, 0, 0, 0, 0, 0)
The only constant thing is the deletion of the locale: std::locale::~locale
Compiler is:
CC: Sun C++ 5.9 SunOS_sparc Patch 124863-07 2008/08/22
Any clues?
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk