草庐IT

持有者

全部标签

c++ - 为什么共享锁只能持有一把可升级锁

Theboostdocumentationforupgradableandsharedlocks说当持有共享锁时,只有一个其他线程可以获得可升级的锁。因此,如果其他线程在共享锁与可升级锁一起持有时尝试获取可升级锁,它们将阻塞。当多个线程与一个(或多个共享锁)一起获取可升级锁时,是否存在我遗漏的死锁可能性?或者这只是一个合乎逻辑的要求(所以“不应该这样做”之类的事情)?请注意,我不是在谈论独占锁定状态。只有可升级的锁定状态。如果可升级锁与其他共享锁一起持有,则它本质上是一个READ锁。那为什么不能把两把可升级的锁放在一起呢? 最佳答案

c++ - 持有锁时 fork

我有以下程序:#include#include#include#includeintmain(){pthread_mutex_tlock_;pthread_mutexattr_tma;pthread_mutexattr_init(&ma);pthread_mutexattr_setpshared(&ma,PTHREAD_PROCESS_SHARED);pthread_mutexattr_settype(&ma,PTHREAD_MUTEX_ERRORCHECK);pthread_mutex_init(&lock_,&ma);pthread_mutex_lock(&lock_);if(fo

c++ - 在逗号运算符的 LHS 中初始化匿名互斥锁持有类实例

假设我有这样的代码:#include"boost/thread/mutex.hpp"usingboost::mutex;typedefmutex::scoped_locklock;mutexmut1,mut2;voidFunc(){//...}voidtest_raiicomma_1(){lockmut1_lock(mut1);Func();}voidtest_raiicomma_2(){(lock(mut1)),Func();}voidtest_raiicomma_3(){(lock(mut1)),(lock(mut2)),Func();//Warning!}intmain(){te

c++ - 持有对 Derived 的引用的基类

我想这样做:structDerived;structBase{Derivedconst&m_ref;Base(Derivedconst&ref):m_ref(ref){}};structDerived:Base{Derived():Base(*this){}};但我似乎得到了不可靠的行为(稍后使用时,m_ref指向无效派生的事物)。是否允许在类初始化之前构造对Derivedfrom*this的引用?我知道在初始化之前使用这样的引用是无效的,但我不明白对类初始化的更改会如何影响对它的引用(自初始化以来它不会在内存中四处移动...)。我不确定如何称呼我正在尝试做的事情,所以我搜索这方面的信

c++ - 不持有锁的本地静态初始化避免了 C++11 中可能出现的死锁?

论文http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm提出了一种算法,该算法在局部静态变量的初始化期间不需要持有锁,但仍会导致通过变量定义的并发控制流等待初始化完成。论文说这样做的好处是避免了可能出现的死锁Thecoreproblemwithfunction-localstatic-durationobjectinitializationisthatthecontainingfunctionmaybeinvokedconcurrently,andthusthedefinitionmayexecuteconc

c++ - 使用 C++ 创建所有者绘制的菜单,2012 风格

我的任务目标很简单——将图标添加到通过调用TrackPopupMenuAPI显示的上下文菜单中。但显然,为Windows编写代码就像用勺子划水一样,除了制作所有者绘制的菜单外,没有简单的方法来添加图标。所以我做了一些搜索,得到了一堆关于所有者绘制菜单主题的C++代码,但到目前为止我找不到任何适合我的代码。原因很简单——它绘制的菜单看起来像从Windows95中出来的东西……那么有什么方法可以使所有者绘制的菜单具有默认的Windows7外观吗?附言。如果有更简单的方法向菜单项添加图标,例如LoadIcon然后ChangeMenuItem来设置它,如果有人能告诉我如何操作,我将不胜感激,因

C++从成员指针转换回持有类指针

我有以下类(class):classSSVec{public:floatvalues[8];}我有一个对象SSVecobj,我将float*指针obj.values传递给另一个函数。在代码的其他地方,我得到了这个float*指针,然后将它转换回SSVec*指针。这在C++标准定义的行为方式中可能吗?大多数情况下,这将适用于静态转换,但我猜这实际上是未定义的行为。原因是float*指针传入和传出DLL,而DLL对SSVec一无所知。我保证传递的指针始终指向SSVec::value[8]对象成员。该类可能更复杂,但它不派生自任何东西,没有虚函数,并且只包含POD类型。values是第一个成

c++ - 确保当前线程持有 C++11 互斥锁

有没有办法判断C++11中的当前线程是否持有互斥锁?特别是我想确保类中的某些函数仅在调用线程持有锁时被调用(通过std::lock_guard、std::unique_lock或类似的东西)对于对象,std::mutex是一个成员变量。为了避免在对象被广泛使用时重复锁定和解锁,锁定mutex的责任需要由调用者负责,不能在每个单独的函数中,如果当前当调用这些函数中的任何一个时,线程没有锁定mutex,我想抛出异常。看来我不能只使用std::try_lock然后根据需要进行解锁,因为如果当前线程std::try_lock的行为是未定义的已经持有锁。 最佳答案

c++ - 为什么类持有可复制的引用?

有一个持有引用的类,我希望下面的代码会失败,但它可以编译:#includestructReferenceHolder{std::string&str;ReferenceHolder(std::string&str):str(str){}};//Whydoesthiscompile?ReferenceHolderf(){std::stringstr="Hello";returnReferenceHolder(str);}intmain(){ReferenceHolderh=f();std::cout编译器:g++4.7.2(带-std=c++11)编辑:即使使用-fno-elide-co

c++ - 不持有锁的条件变量信号

所以我刚刚发现,如果您没有持有c++11中的锁,则向条件变量发出信号是合法的。这似乎为某些令人讨厌的竞争条件打开了大门:std::mutexm_mutex;std::condition_variablem_cv;T1:std::unique_locklock(m_mutex);m_cv.wait(lock,[]{return!is_empty();});T2:generate_data();m_cv.notify();是否保证T1永远不会在我们首先检查is_empty()(它返回true)然后被T2抢占的情况下结束,T2创建一些数据并向条件变量发出信号,然后我们才能真正等待它?如果这保