程序中的异常抛出 - 不确定如何调试

时间:2014-01-27 20:22:49

标签: c++ multithreading c++11 concurrency mutex

我在boost库文件shared_ptr.hpp中遇到异常:

// Move support

#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )

    shared_ptr( shared_ptr && r ) BOOST_NOEXCEPT : px( r.px ), pn()
    {                                       //Exception highlighted on this row
        pn.swap( r.pn );
        r.px = 0;
    }

    template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )

    shared_ptr( shared_ptr<Y> && r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )

我认为这与多个线程读取/写入跨共享的同一对象有关。我(直到现在)没有实现任何锁。在下面的代码片段中,您将看到我(未成功)使用互斥锁 - 无效。

我有一个程序(不能把所有代码放在这里 - 太多)从几个文件(每个文件一个线程)读取数据并处理下面函数中的数据。换句话说,每个线程都运行以下代码的副本:

idict在线程间共享,是std::unordered_map<std::string, boost::shared_ptr<I>> object)

void A::y(std::vector<char> rm, std::unordered_map<std::string, boost::shared_ptr<I> > idict){

    std::vector<boost::shared_ptr<Order> > SubTickets = d->getTickets(rm);

    for(boost::shared_ptr<Order> latest_ticket : SubTickets){

        //Just a getter method on latest_ticker
        std::string sid = latest_ticket->getSID();

        //Tried using mutexes but I still get the exception???
        mtx.lock();

        if(idict.count(sid) == 1){

            //Grabs an I object from a dictionary. This dictionary is shared across threads
            boost::shared_ptr<I> oi = idict[sid];

            //Just a getter method on oi
            boost::shared_ptr<OB> iob = oi->getOB();

            //Just a getter method on oi
            boost::shared_ptr<E> ie = oi->getE();

            //latest_ticket and iob are not shared across the threads
            boost::shared_ptr<OBM> mod = ie->getOM(latest_ticket, iob);

            //cs is an object which is shared amonst threads
            cs->do(mod);
            cs->check(oi);
        }
        mtx.unlock();
    }
}

我很感激由于你不知道两个互斥体之间发生了什么而给出的帮助是有限的 - 但基于上述情况,我绝对可以肯定我的并发问题不会发生在互斥体中吗?

编辑:

将lock()和unlock()移动到几乎包围了整个函数,我在文件sp_counted_base_w32.hpp中得到了一个异常:

void release() // nothrow
{
    if( BOOST_INTERLOCKED_DECREMENT( &use_count_ ) == 0 )
    {
        dispose();
        weak_release();
    }
}

0 个答案:

没有答案