代码之家  ›  专栏  ›  技术社区  ›  cchampion

使用boost::scoped_lock(mutex&mx,bool初始_locked)构造函数会给出错误

  •  3
  • cchampion  · 技术社区  · 14 年前

    不是有一个boost::scoped的\u lock构造函数将布尔值作为第二个参数吗?我以为我以前用过。 boost::作用域锁定(mutex&mx,bool最初锁定)

    这个 documentation 对于作用域,锁将第二个参数显示为“ 未指定的 “。有人知道@(*$这是什么意思????

    我得到的错误是:

    c:\program files\boost\boost_1_39\boost\thread\win32\basic_timed_mutex.hpp(118) : error C2679: binary '+' : no operator found which takes a right-hand operand of type 'const bool' (or there is no acceptable conversion)
            c:\program files\boost\boost_1_39\boost\date_time\posix_time\date_duration_operators.hpp(31): could be 'boost::posix_time::ptime boost::posix_time::operator +(const boost::posix_time::ptime &,const boost::gregorian::months &)' [found using argument-dependent lookup]
            c:\program files\boost\boost_1_39\boost\date_time\date_duration_types.hpp(132): or       'boost::gregorian::date boost::date_time::months_duration<base_config>::operator +(const boost::gregorian::date &,const boost::date_time::months_duration<base_config> &)' [found using argument-dependent lookup]
            with
            [
                base_config=boost::gregorian::greg_durations_config
            ]
            c:\program files\boost\boost_1_39\boost\date_time\posix_time\date_duration_operators.hpp(75): or       'boost::posix_time::ptime boost::posix_time::operator +(const boost::posix_time::ptime &,const boost::gregorian::years &)' [found using argument-dependent lookup]
            c:\program files\boost\boost_1_39\boost\date_time\date_duration_types.hpp(244): or       'boost::gregorian::date boost::date_time::years_duration<base_config>::operator +(const boost::gregorian::date &,const boost::date_time::years_duration<base_config> &)' [found using argument-dependent lookup]
            with
            [
                base_config=boost::gregorian::greg_durations_config
            ]
            c:\program files\boost\boost_1_39\boost\date_time\time.hpp(139): or       'boost::posix_time::ptime boost::date_time::base_time<T,time_system>::operator +(const boost::gregorian::date_duration &) const'
            with
            [
                T=boost::posix_time::ptime,
                time_system=boost::posix_time::posix_time_system
            ]
            c:\program files\boost\boost_1_39\boost\date_time\time.hpp(159): or       'boost::posix_time::ptime boost::date_time::base_time<T,time_system>::operator +(const boost::posix_time::time_duration &) const'
            with
            [
                T=boost::posix_time::ptime,
                time_system=boost::posix_time::posix_time_system
            ]
            while trying to match the argument list '(boost::system_time, const bool)'
            c:\program files\boost\boost_1_39\boost\thread\locks.hpp(353) : see reference to function template instantiation 'bool boost::detail::basic_timed_mutex::timed_lock<TimeDuration>(const Duration &)' being compiled
            with
            [
                TimeDuration=bool,
                Duration=bool
            ]
            c:\program files\boost\boost_1_39\boost\thread\locks.hpp(241) : see reference to function template instantiation 'bool boost::unique_lock<Mutex>::timed_lock<TimeDuration>(const TimeDuration &)' being compiled
            with
            [
                Mutex=boost::mutex,
                TimeDuration=bool
            ]
            d:\imagehawk\projects\virtualpc_archiveservice\ifl\src\archiveservice\archive.cpp(599) : see reference to function template instantiation 'boost::unique_lock<Mutex>::unique_lock<bool>(Mutex &,const TimeDuration &)' being compiled
            with
            [
                Mutex=boost::mutex,
                TimeDuration=bool
            ]
    

    这里有一些我的源代码,如果它有帮助的话:

    void SpawnXMessageThread(bool bTakeLock=true) {
        boost::mutex::scoped_lock lock(m_mtx,bTakeLock);
        m_pxmessage= new XMessage();
        m_pThread = new boost::thread(boost::ref(*m_pxmessage));
    }
    

    我的想法是基于布尔值锁定m_mtx。这样,如果我在调用spawxmessagethread之前锁定m_mtx,我可以告诉spawxmessagethread不要锁定互斥体(因为我已经锁定了它)。

    顺便说一句,我是一个新来的助推器和线程。

    1 回复  |  直到 14 年前
        1
  •  3
  •   jpalecek    14 年前

    根据文件,你不能直接这么做。但是你可以这样做:

    boost::unique_lock lck(m_mtx, boost::defer_lock);
    if(bTakeLock) lck.lock();