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;
}