草庐IT

needs-lock

全部标签

c++ - 使用 std::try_to_lock 的意外行为

当我尝试运行以下代码时,我遇到了令人惊讶和冲突的行为。#include#includeintmain(){std::mutexmtx;std::unique_locklock1(mtx);std::unique_locklock2(mtx,std::try_to_lock);std::cout当我在我的计算机上运行它时(使用clang++4.0.1或g++7.3.0的linux)它打印出lock1和lock2拥有锁(奇怪)。当我在cpp.sh上运行它时,它说lock1拥有锁,但lock2不拥有锁(如我所料)。所有都使用C++11和-Wall没有优化。 最佳答

c++ - `unique_lock`、 `scoped_lock` 和 `lock_guard` 中指定的 mutex_type 的用例是什么?

用于保护std::mutex的c++11mutexRAII类型都有一个typedef:typedefMutexmutex_type;std::lock_guard::mutex_typestd::unique_lock::mutex_typestd::scoped_lock::mutex_type这个成员typedef有什么意义?起初我认为它可以用来概括创建一个对象来移动锁(在unique_lock的情况下)例如:templatevoidfunction(SomeLockin)SomeLock::mutex_typenewMutex;//Dosomething但我无法想象它的用途。需要

c++ - _locking() 到底做了什么?

正在寻找this的答案问题我找到函数_locking().There告诉它Locksorunlocksbytesofafile(实际上我无法理解这句话的真正含义)。如果有人有使用该功能的经验,是否可以使用该功能解决第一个问题中描述的问题? 最佳答案 引用您链接的MSDN页面:int_locking(intfd,intmode,longnbytes);The_lockingfunctionlocksorunlocksnbytesbytesofthefilespecifiedbyfd.Lockingbytesinafileprevent

c++ - g++: 错误: 无法识别的选项 ‘--as-needed’

我正在使用带有gcc4.6.3版的Ubuntu12.10。我正在尝试构建我的代码,但在使用“make”命令时出现错误g++:error:unrecognizedoption‘--as-needed’我的Makefile如下所示:LFLAGS=-Wl,-rpath,.-Wl,-rpath-link,../bin--as-neededLDFLAGS=$(RPATH)$(RPATHLINK)-L$(USRLIB)--as-needed之前这段代码是在RedHatLinux上成功构建的。但现在我需要在Ubuntu上运行这段代码。如果有人知道这件事。请帮忙问候高拉夫

c++ - 链接时, "grab what you need"和 "grab all"(-Wl,--whole-archive) 之间有什么东西吗?

我有这个库,它涉及一些需要在main()之前运行的静态初始化代码。如果您只是将所有翻译单元编译在一起,一切都会很好,但如果我提供一个静态库(.a文件)并让用户将他们的应用程序链接到它-链接器,它就不起作用简单地忽略执行我的静态初始化的符号。或者,如果我为GCC指定-Wl,--whole-archive选项,我可以让链接器获取静态库中的一切,即指定GNU链接的--whole-archive选项。但是有中间立场吗?我能否标记一些符号并让链接器始终为可执行文件选择它们,而其余符号仅在需要时才添加?动机:我使用一些staticblocks在工厂注册类(class);我想让我的代码作为(非动态)

c++ - 在什么时候将 unique_lock 与 shared_mutex 一起使用?

通常,当使用“普通”互斥量时,您会像在remove1()中那样使用它。但是,现在有了shared_lock和unique_lock,是否应该先使用共享锁,只有在必要时才使用唯一锁?请注意,当模型不存在时,remove()可能不需要unique_lock。voidremove1(intid){std::unique_locklock(mutex_);for(autoit=models_.begin();it!=models_.end();++it)if((*it)->getId()==id){it=models_.erase(it);return;{}voidremove2(intid)

c++ - is_lock_free() 在升级到 MacPorts gcc 7.3 后返回 false

以前,在AppleLLVM9.1.0中,128位结构上的is_lock_free()已返回true。为了获得完整的std::optional支持,我随后升级到MacPortsgcc7.3。在我第一次尝试编译时,我遇到了这个臭名昭著的showstopper链接器错误:Undefinedsymbolsforarchitecturex86_64:"___atomic_compare_exchange_16",referencedfrom:我知道我可能需要添加-latomic。使用AppleLLVM9.1.0,我不需要它,对此我有一种非常糟糕的预感。如果它是无锁的,你通常不需要链接到任何额外的

c++ - CMutex::Lock 与 CSingleLock::Lock

我被要求支持一些遗留代码,我看到了一些让我摸不着头脑的事情。在某些代码段中,我看到类实例使用CMutex实例来同步方法执行。例如classCClassA:publicCObject{public:voidDoSomething();private:CMutexm_mutex;}voidCClassA::DoSomething(){m_mutex.Lock();//...logic...m_mutex.Unlock();}在同一项目的其他地方,我发现代码正在使用CSingleLockclassCClassB:publicCObject{public:voidDoSomething();p

c++ - 触发 COM 事件时调用 Lock()/Unlock() 的目的是什么?

ATLCOM服务器中触发事件的一段典型代码如下(从thisquestion复制并略微删减):HRESULTFire_MessageTrigger(){HRESULThr=S_OK;T*pThis=static_cast(this);intcount=m_vec.GetSize();for(inti=0;iLock();//I'maskingaboutthis...CComPtrpunkConnection=m_vec.GetAt(i);pThis->Unlock();//andthisIDispatch*pConnection=static_cast(punkConnection.p)

c++ - 为什么 std::condition_variable 采用 unique_lock 而不是 lock_guard?

这个问题在这里已经有了答案:C++11:whydoesstd::condition_variableusestd::unique_lock?(2个答案)关闭4年前。std::condition_variable使用如下:std::condition_variablecv;...std::unique_locklk(m);cv.wait(lk,[]{returnprocessed;});在我看来有一个有趣的问题。unique_lock可以延迟,它可以被交换掉。它可能有许多其他代码设计原因,不一定是错误的,它实际上没有被锁定。例如。std::unique_locklk(m,std::try