Boost logo

Boost Users :

From: Suresh Lakshmanan (suresh.lakshmanan_at_[hidden])
Date: 2008-05-15 08:57:36


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



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net