Are you linking the to multi-threaded version of the regex
library?
hi,
i'm using boost regex in a multithreaded environment
with
os: fedora 7
boost version: 1.33.1
g++: 4.1.2
i've
attached a small sample program that crashes often; but not always (once in 4-5
runs)
curiously, the same program runs without any issue on fedora 8,
boost 1.34.1. is there any
issue using
boost-regex 1.33.1 in multi-threaded environment?
stack
trace:
#0 0x00a22402 in __kernel_vsyscall ()
#1 0x00b921c0 in
raise () from /lib/i686/nosegneg/libc.so.6
#2 0x00b93ba1 in abort ()
from /lib/i686/nosegneg/libc.so.6
#3 0x07fa9540 in
__gnu_cxx::__verbose_terminate_handler () from
/usr/lib/libstdc++.so.6
#4 0x07fa7025 in ?? () from
/usr/lib/libstdc++.so.6
#5 0x07fa7062 in std::terminate () from
/usr/lib/libstdc++.so.6
#6 0x07fa719a in __cxa_throw () from
/usr/lib/libstdc++.so.6
#7 0x00235adb in boost::regex_error::raise ()
from /usr/lib/libboost_regex.so.2
#8 0x00205f1f in
boost::re_detail::basic_regex_parser<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >::fail () from
/usr/lib/libboost_regex.so.2
#9 0x0020771f in
boost::re_detail::basic_regex_parser<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >::parse_repeat_range () from
/usr/lib/libboost_regex.so.2
#10 0x00218c7e in
boost::re_detail::basic_regex_parser<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >::parse_extended () from
/usr/lib/libboost_regex.so.2
#11 0x002087db in
boost::re_detail::basic_regex_parser<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >::parse_open_paren () from
/usr/lib/libboost_regex.so.2
#12 0x00218bd6 in
boost::re_detail::basic_regex_parser<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >::parse_extended () from
/usr/lib/libboost_regex.so.2
#13 0x002334e4 in
boost::re_detail::basic_regex_parser<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >::parse () from
/usr/lib/libboost_regex.so.2
#14 0x002349c1 in boost::basic_regex<char,
boost::regex_traits<char, boost::cpp_regex_traits<char> >
>::do_assign () from /usr/lib/libboost_regex.so.2
#15 0x0804babc in
boost::basic_regex<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >::assign ()
#16 0x0804bb06 in
boost::basic_regex<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> >
>::assign<std::char_traits<char>, std::allocator<char> >
()
#17 0x0804bb42 in boost::basic_regex<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> >
>::basic_regex<std::char_traits<char>, std::allocator<char>
> ()
#18 0x0804a2b5 in work ()
#19 0x0804a4e7 in thread_func ()
#20
0x00d0f472 in start_thread () from /lib/i686/nosegneg/libpthread.so.0
#21
0x00c3b89e in clone () from
/lib/i686/nosegneg/libc.so.6
code:
#include
<boost/regex.hpp>
#include <iostream>
#include
<string>
#include <pthread.h>
using namespace
std;
void work(const std::string& input, const std::string&
pattern, const std::string&
replace_by,
const std::string&
card, int thread_id)
{
const boost::regex
search_pattern(pattern);
const boost::regex
card_pattern(card);
std::string out =
regex_replace(input, search_pattern, replace_by,
boost::match_default);
std::cout << thread_id
<< ": " << out << endl;
}
void* thread_func(void*
id)
{
const string input =
"0123-4567-8901-2345";
const string pattern =
"1";
const string replace_by =
"one";
const string card = "(\\d{3,4})[- ]?(\\d{4})[-
]?(\\d{4})[- ]?(\\d{4})";
int thread_id =
(int)id;
work(input, pattern, replace_by, card,
thread_id);
return 0;
}
const int
MAX_THREADS = 32;
int main()
{
pthread_t
threads[MAX_THREADS];
std::list<pthread_t*>
created_thread_ptrs;
for (int i = 0; i <
MAX_THREADS; ++i) {
if
(pthread_create(&(threads[i]), 0, thread_func, (void*)i) == 0)
{
created_thread_ptrs.push_back(&(threads[i]));
}
else
{
cerr
<< "Error creating thread " << i <<
endl;
}
}
cerr << "Waiting for threads to
terminate\n";
for (std::list<pthread_t*>::iterator
it =
created_thread_ptrs.begin();
it !=
created_thread_ptrs.end();
++it) {
pthread_join(*(*it),
0);
}
return
0;
}