Are you linking the to multi-threaded version of the regex library?


From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Suresh Lakshmanan
Sent: Thursday, May 15, 2008 8:58 AM
To: boost-users@lists.boost.org
Subject: [Boost-users] boost-regex crashes in multithreaded

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This message is intended only for the personal and confidential use of the designated recipient(s) named above. If you are not the intended recipient of this message you are hereby notified that any review, dissemination, distribution or copying of this message is strictly prohibited. This communication is for information purposes only and should not be regarded as an offer to sell or as a solicitation of an offer to buy any financial product, an official confirmation of any transaction, or as an official statement of Lehman Brothers. Email transmission cannot be guaranteed to be secure or error-free. Therefore, we do not represent that this information is complete or accurate and it should not be relied upon as such. All information is subject to change without notice. -------- IRS Circular 230 Disclosure: Please be advised that any discussion of U.S. tax matters contained within this communication (including any attachments) is not intended or written to be used and cannot be used for the purpose of (i) avoiding U.S. tax related penalties or (ii) promoting, marketing or recommending to another party any transaction or matter addressed herein.