草庐IT

c++ - 带 if 条件的作用域锁

我想创建作用域锁,但我想要类似的东西:{if(lockRequired)boost::mutex::scoped_lock(Mutex);//Afterthislinewegooutofscope/*HereIalsowanttohaveMutex*/}如果条件为真,我想要锁定互斥锁,但在升级范围内。我知道我可以使用简单的.lock并在范围末尾使用.unlock但我有很多返回路径。我还可以在范围内创建一些SynchronizationGuard并且whed析构函数被称为unlockmutex但这不是干净的解决方案。一些建议?最好的问候。 最佳答案

C++:具有 `std::lock_guard` 的互斥量是否足以同步两个 `std::thread`?

我的问题是基于下面的C++代码示例#include#include#include#includeclassClassUtility{public:ClassUtility(){}~ClassUtility(){}voiddo_something(){std::coutlock(g_mutex);std::coutlock(g_mutex);std::cout如果需要,这更像是一个问题,目的是让我的理解更清楚,并获取std::condition_variable的示例用法。我有2个C++std::thread,它们在main方法中启动。它是osx上的控制台应用程序。所以使用clang编

c++ - 公共(public)变量访问的线程安全

我的类中有一些私有(private)变量(比如inta、intb、intc)。由于一些内部操作,我需要以线程安全的方式设置/获取此类变量,因此我使用了一些包装getter/setter并使用了作用域互斥体。voidsetA(inta){unique_locklock(opMutex);this->a=a;}voidgetA(inta){unique_locklock(opMutex);returna;}voidsetB(intb){unique_locklock(opMutex);this->b=b;}voidsetC(intc){unique_locklock(opMutex);th

c++ - GCC C++11 条件变量等待内部机制

我正在寻找我们遇到的一个错误,一些困惑的线程/条件变量类被更新为使用C++11线程。在搜寻过程中,我在GCC代码库中遇到了以下内容:templatevoidwait(_Lock&__lock){unique_lock__my_lock(_M_mutex);_Unlock__unlock(__lock);//_M_mutexmustbeunlockedbeforere-locking__locksomove//ownershipof_M_mutexlocktoanobjectwithshorterlifetime.unique_lock__my_lock2(std::move(__my_

c++ - 如何在 boost::unique_lock<boost::mutex> 上尝试锁定

根据标题,如何在boost::unique_lock上尝试锁定?我有这段代码:voidmySafeFunct(){if(myMutex.try_lock()==false){return-1;}//mutexownershipisautomaticallyacquired//dostuffsafelymyMutex.unlock();}现在我想使用unique_lock(它也是一个作用域互斥体)而不是普通的boost::mutex。我希望这样可以避免函数体中的所有unlock()调用。 最佳答案 您可以使用Deferconstruc

c++ - std::lock_guard<std::mutex> 施工段错误?

我正在尝试使用std::mutex和std::lock_guard访问共享的std::queue。mutex(pending_md_mtx_)是另一个对象(其地址有效)的成员变量。我的代码似乎在lock_guard的构造上出现了段错误。有什么想法吗?我应该改用std::unique_lock(或其他对象)吗?在UbuntuLinux下运行GCC4.6(--std=c++0x)。我无法发布整个类(class),但只能访问下面列出的互斥锁和队列。templateclassDriver{public:templateDriver(Args&&...args):listener_(std::f

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

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

c++ - 带中断的互斥安全(嵌入式固件)

编辑@Mike指出我下面代码中的try_lock函数是不安全的,并且访问器创建也会产生竞争条件。(来自每个人的)建议使我确信我走上了错误的道路。原始问题嵌入式微Controller上的锁定要求与多线程不同,我无法将多线程示例转换为我的嵌入式应用程序。通常我没有任何类型的操作系统或线程,只有main以及硬件定期调用的任何中断函数。我需要从中断中填充缓冲区是很常见的,但在main中处理它是很常见的。.我创建了IrqMutex下面的类来尝试安全地实现这一点。每个试图访问缓冲区的人都通过IrqMutexAccessor被分配了一个唯一的ID。,那么他们每个人都可以try_lock()和unlo

C++ weak_ptr.lock() 段错误

所以我有这个函数来添加监听器,它转换一个类的共享指针,以便我稍后在收到通知时可以调用它。voidregisterListener(std::shared_ptrlistener){if(!listener){qCWarning(OBSERVER_LOGGER)lock()){if(listener==shared){return;}iter++;}else{iter=listeners.erase(iter);}}autoweak=std::weak_ptr(listener);listeners.push_back(weak);}voidnotify(std::function)>o

c++ - C++11 中的 BOOST scoped_lock 替换

我面临这样一种情况,我必须用C++11中的等效项替换BOOSTscoped_lock。在visualstudio2013下。由于c++11不支持scoped_lock,我不确定下面的替换代码是什么。我应该选择lock_guard还是try_lock?boost::mutex::scoped_lockobjectLock(ObjectVectorMutex,boost::try_to_lock);if(objectLock){//...}在代码中我有以下“等待”语句if(ObjectsCollection.empty()){//Thisiswherewewaittilsomethingi