std::string & multithreading

Radu Marginean radu_marg@yahoo.com
Fri Feb 26 20:19:00 GMT 2010


To be more clear here the relevant lines of code:

while (fragment.length() > 0 && (fragment[fragment.length() - 1] <= 32 || fragment[fragment.length() - 1] == 160)) {
   fragment = fragment.substr (0, fragment.length() - 1);
}

--- On Fri, 2/26/10, Radu Marginean <radu_marg@yahoo.com> wrote:

> From: Radu Marginean <radu_marg@yahoo.com>
> Subject: Re: std::string & multithreading
> To: libstdc++@gcc.gnu.org
> Date: Friday, February 26, 2010, 3:06 PM
> Indeed the problem does not occur
> when accessing unrelated strings. Here is a backtrace:
> 
> #0  0x00007f1621dedffb in memcpy () from
> /lib64/libc.so.6
> #1  0x00007f162239da6c in ?? () from
> /usr/lib64/libstdc++.so.6
> #2  0x00007f162239dc3a in
> std::basic_string<wchar_t,
> std::char_traits<wchar_t>,
> std::allocator<wchar_t>
> >::basic_string(std::basic_string<wchar_t,
> std::char_traits<wchar_t>,
> std::allocator<wchar_t> > const&, unsigned
> long, unsigned long)
>     () from /usr/lib64/libstdc++.so.6
> #3  0x00007f162239dc72 in
> std::basic_string<wchar_t,
> std::char_traits<wchar_t>,
> std::allocator<wchar_t> >::substr(unsigned long,
> unsigned long) const ()
>    from /usr/lib64/libstdc++.so.6
> #4  0x000000000042bf46 in
> Parsers::HTMLParser::ExtractWordsAndLinks (
>     this=0x7f16057f1580) at
> parsers/HTMLParser.cpp:352
> #5  0x000000000042e3f3 in Parsers::HTMLParser::Run
> (this=0x7f16057f1580)
>     at parsers/HTMLParser.cpp:62
> #6  0x000000000040e59a in downloader_thread
> (arg=0x7f15e0151110)
>     at src/downloader_thread.hpp:406
> #7  0x00007f16225f2070 in start_thread () from
> /lib64/libpthread.so.0
> #8  0x00007f1621e4111d in clone () from
> /lib64/libc.so.6
> 
> The specific code line where it fails is line 352:
> > fragment = fragment.substr (0, fragment.length() -
> 1);
>  
> Is there any method to avoid this problem?
> 
> Thank you,
> Radu
> 
> 
> --- On Fri, 2/26/10, Marc Glisse <marc.glisse@normalesup.org>
> wrote:
> 
> > From: Marc Glisse <marc.glisse@normalesup.org>
> > Subject: Re: std::string & multithreading
> > To: "Radu Marginean" <radu_marg@yahoo.com>
> > Cc: libstdc++@gcc.gnu.org
> > Date: Friday, February 26, 2010, 6:32 AM
> > On Fri, 26 Feb 2010, Radu Marginean
> > wrote:
> > 
> > > Currently std::string cannot be safely used in a
> > multithreaded environment due to features like copy on
> write
> > and reference counting. Even programs that access two
> > unrelated different string objects in a multicore
> machine
> > may suffer random crashes.
> > 
> > Is that really the case? Last time I checked, the
> > implementation didn't use any global/static variables,
> so no
> > reason for unrelated strings to interact, and the
> reference
> > counting used atomic operations, which is enough to
> allow
> > for quite a few multithreading scenarios. Now
> obviously that
> > doesn't make operations on strings atomic, but that
> is
> > seldom needed.
> > 
> > For what precise use did you notice these random
> crashes?
> > 
> > -- Marc Glisse
> > 
> 
> 
>       
> 






More information about the Libstdc++ mailing list