Note that there are some explanatory texts on larger screens.

plurals
  1. POboost::weak_ptr<T>.lock() Crashes with a SIGSEGV Segmentation Fault
    primarykey
    data
    text
    <p>(EDIT) Environment:</p> <pre><code>plee@sos-build:/usr/local/include/boost$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 11.10 Release: 11.10 Codename: oneiric plee@sos-build:/usr/local/include/boost$ uname -a Linux sos-build 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux plee@sos-build:/usr/local/include/boost$ plee@sos-build:/usr/local/include/boost$ cat version.hpp // BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION #define BOOST_LIB_VERSION "1_47" </code></pre> <p>I have been working on a server-side project. I use boost libraries, such as, <code>boost::asio</code>, <code>boost::shared_ptr</code>, and <code>boost::weak_ptr</code>.</p> <p>The Boost documentation (<a href="http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/weak_ptr.htm#lock" rel="nofollow">http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/weak_ptr.htm#lock</a>) says that the <code>weak_ptr&lt;T&gt;.lock</code> never throws:</p> <blockquote> <p>lock</p> <p>shared_ptr lock() const; Returns: expired()? shared_ptr(): shared_ptr(*this).</p> <p>Throws: nothing.</p> </blockquote> <p>However, in my application, it's even crashed:</p> <pre><code>Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7fffeffff700 (LWP 5102)] 0x000000000066fe08 in boost::detail::atomic_conditional_increment (pw=0x800000000007) at /usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:92 92 ); (gdb) (gdb) bt #0 0x000000000066fe08 in boost::detail::atomic_conditional_increment (pw=0x800000000007) at /usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:92 #1 0x000000000066fe5c in boost::detail::sp_counted_base::add_ref_lock (this=0x7fffffffffff) at /usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:138 #2 0x000000000068009b in boost::detail::shared_count::shared_count (this=0x7fffefffe658, r=...) at /usr/local/include/boost/smart_ptr/detail/shared_count.hpp:518 #3 0x0000000000691599 in boost::shared_ptr&lt;RtmpConnection&gt;::shared_ptr&lt;RtmpConnection&gt; ( this=0x7fffefffe650, r=...) at /usr/local/include/boost/smart_ptr/shared_ptr.hpp:216 #4 0x000000000068db48 in boost::weak_ptr&lt;RtmpConnection&gt;::lock (this=0x7fffe0e87e68) at /usr/local/include/boost/smart_ptr/weak_ptr.hpp:157 </code></pre> <p>I checked the line crashed in <code>/usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp</code></p> <pre><code> 69 inline int atomic_conditional_increment( int * pw ) 70 { 71 // int rv = *pw; 72 // if( rv != 0 ) ++*pw; 73 // return rv; 74 75 int rv, tmp; 76 77 __asm__ 78 ( 79 "movl %0, %%eax\n\t" 80 "0:\n\t" 81 "test %%eax, %%eax\n\t" 82 "je 1f\n\t" 83 "movl %%eax, %2\n\t" 84 "incl %2\n\t" 85 "lock\n\t" 86 "cmpxchgl %2, %0\n\t" 87 "jne 0b\n\t" 88 "1:": 89 "=m"( *pw ), "=&amp;a"( rv ), "=&amp;r"( tmp ): // outputs (%0, %1, %2) 90 "m"( *pw ): // input (%3) 91 "cc" // clobbers 92 ); 93 94 return rv; 95 } </code></pre> <p>The line 92 is assembly code. I really don't know what that means.</p> <p>I always do the check if the returned <code>boost::weakptr&lt;RtmpConnection&gt;.lock()</code> (type of <code>boost::shared_ptr&lt;RtmpConnection&gt;</code> is empty before I used it.</p> <p>So I googled, I saw this <a href="http://wiki.inkscape.org/wiki/index.php/Boost_shared_pointers" rel="nofollow">http://wiki.inkscape.org/wiki/index.php/Boost_shared_pointers</a></p> <blockquote> <p>Weak pointers cannot be dereferenced for thread safety reasons. If some other thread destroyed the object after you checked the weak pointer for expiry but before you used it, you would get a crash</p> </blockquote> <ol> <li>So what should I do to deal with it, why does it crash (it seems <code>boost::weakptr&lt;RtmpConnection&gt;.lock()</code> should never crash)?</li> <li>Since my program is multithreaded. It's possible that after I get and check the returned value of <code>boost::weakptr&lt;RtmpConnection&gt;.lock()</code>, the <code>RtmpConnection</code> might be destroyed by other thread, does the Boost Library guarantee that it won't be destroyed, because the return type is <code>boost::shared_ptr&lt;RtmpConnection&gt;</code>?</li> </ol>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload