草庐IT

mutex_lock

全部标签

c++ - 为什么 std::mutex 比 CRITICAL_SECTION 慢两倍

std::mutex是用关键部分实现的,这就是为什么它比OSMutex(在Windows上)快得多。但是它不如WindowsCRITICAL_SECTION快。计时只是一个线程中的一个紧密循环:423.76nsATLCMutex41.74nsstd::mutex16.61nswin32CriticalSection我的问题是std::mutex还做了什么?我查看了来源,但无法理解。然而,在它服从CritSec之前还有额外的步骤。我的问题是:这些额外的步骤是否有用?也就是说,额外的步骤是什么?使用CRITICAL_SECTION我会错过什么?还有,如果它不是用Mutex实现的,为什么他们

java - 是否有与 java.util.concurrent.locks.ReentrantReadWriteLock 等效的 C++?

我想控制对一组数据类的getter和setter的访问,使它们可以同时从多个线程安全地访问。我之前在Java中使用java.util.concurrent.locks.ReentrantReadWriteLock完成过此操作,非常轻松。但是现在我在我当前的C++项目中遇到了很多麻烦,因为我找不到可重入的读/写锁实现。具体来说,我想要一个允许线程在已经拥有写锁的情况下获得读锁,而不会阻塞且不会先放弃写锁。原因很简单:我的一些setter方法调用getter方法,前者(通常)获得写锁,后者获得读锁。我不想为了解决锁类中的限制而扭曲我简单的getter/setter架构。我试过Qt(4.8)

c++ - boost named_mutex 和 remove() 命令

我有一个可以由多个线程创建的类。但是有一个函数需要保护代码,所以我决定使用boost进程间互斥体。每个类在其构造函数中创建或打开相同的Mutex:MyClass::MyClass(){boost::interprocess::named_mutexm_Lock(boost::interprocess::open_or_create,"myLock");}现在关键代码部分被调用了:intMyClass::MyFunction(){boost::interprocess::scoped_locklock(m_Lock,boost::interprocess::try_to_lock);if

c++ - 为什么我们在进行条件变量通知之前需要一个空的 std::lock_guard?

我目前正在研究Google的Filament作业系统。你可以找到源代码here.让我感到困惑的部分是这个requestExit()方法:voidJobSystem::requestExit()noexcept{mExitRequested.store(true);{std::lock_guardlock(mLooperLock);}mLooperCondition.notify_all();{std::lock_guardlock(mWaiterLock);}mWaiterCondition.notify_all();}我很困惑为什么我们需要锁定和解锁,即使在锁定和解锁之间没有任何Ac

c++ - boost::mutex::~mutex(): 断言 `!pthread_mutex_destroy(&m)' 失败

我在互斥锁析构函数中遇到了上述错误。由于错误可能是由于互斥锁在销毁过程中处于锁定状态,所以我创建了一个新的互斥锁类,它继承自boost:mutex。这是为了确保互斥锁在销毁期间解锁。但是,仍然会出现相同的错误。任何命中将不胜感激!classCMutes:publicboost::mutex{public:CMutes(){};virtual~CMutes(){if(m_bLock)boost::mutex::unlock();};voidlock(){if(!m_bLock)boost::mutex::lock();elsecout编辑:是的你是对的。我应该使用RAII。但是,我处于一

c++ - 释放/获取语义 wrt std::mutex

我正在阅读n3485中定义的C++内存模型,它讨论了释放/获取语义,根据我的理解以及定义giveninthisblog:Acquiresemanticsisapropertywhichcanonlyapplytooperationswhichreadfromsharedmemory,whethertheyareread-modify-writeoperationsorplainloads.Theoperationisthenconsideredaread-acquire.Acquiresemanticspreventmemoryreorderingoftheread-acquirewi

c++ - 返回时复制操作是在 lock_guard 析构函数之前还是之后执行的?

这个问题在这里已经有了答案:C++returnvaluecreatedbeforeorafterautovardestruction?(2个答案)inC++whichhappensfirst,thecopyofareturnobjectorlocalobject'sdestructors?[duplicate](4个答案)关闭4年前。get_a()函数对于竞争条件是否安全,或者我是否需要像在get_b()中那样显式复制str_以便按顺序有一个线程安全的功能?classClass{public:autoget_a()->std::string{auto&&guard=std::lock_

c++ - 如何使用 lock_guard 和 try_lock_for

我可以使用boost::lock_guard获取boost::mutex对象上的锁,并且此机制将确定一旦boost::lock_guard超出范围将释放锁:{boost::lock_guardlock(a_mutex);//Dothework}在这种情况下,无论代码块是否因异常退出,a_mutex都会被释放。另一方面,boost::timed_mutex也支持方法try_lock_for(period),例如if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))){//Dotheworka_timed_mutex.unlock(

c++ - Mutex 的锁定/解锁功能应该是 "const"吗?

我正在维护一个包含Mutex类的库。我无法决定此类公开的lock()和unlock()函数是否应该是const。我在Web上查找了类似的代码,并且可以找到这两种实现。第一个实现,lock()和unlock()不是常量。这意味着在const函数中使用Mutex类的人应该付出额外的努力来调用Mutex的函数:classMutex{public:voidlock();voidunlock();};classFoo{public:voidgetBar(Bar&bar)const{m_mutex.lock();bar=m_bar;m_mutex.unlock();}private://Mutab

c++ - 如何 std::mutex::lock 直到函数返回

我想返回一个std::vector。此std::vector可以从其他线程访问(读和写)。如何在函数完成返回后立即解锁我的std::mutex?例如://Value.cppstd::vectorGetValue(){std::lock_guardlock(mutex);//Dosupersmartstuffhere//...returnm_value;}//MyThread.cppautovec=myVec.GetValue();现在如果“在这里做super聪明的事情”是空的怎么办://Value.cppstd::vectorGetValue(){std::lock_guardlock