我在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();
}
}