草庐IT

c++ - 如何创建锁定和解锁互斥锁的智能指针?

我有一个线程类,我想偶尔从中获取一个实例变量的指针。我希望这种访问受到互斥锁的保护,以便在客户端完成其指针之前阻止线程访问此资源。我最初的方法是返回一对对象:一个是指向资源的指针,一个是指向互斥锁对象的shared_ptr。这个shared_ptr持有对锁定对象的唯一引用,因此当它超出范围时应该解锁互斥锁。像这样的:voidA::getResource(){Lock*lock=newLock(&mMutex);returnpair>(&mResource,shared_ptr(lock));}此解决方案不太理想,因为它需要客户端持有整对对象。这样的行为破坏了线程安全:Resource*

c++ - 标准 C++ 中的共享递归互斥锁

有一个shared_mutex为C++17计划的类(class)。和shared_timed_mutex已经在C++14中了。(谁知道他们为什么按这个顺序出现,但无论如何。)然后有一个recursive_mutex和recursive_timed_mutex从C++11开始。我需要的是一个shared_recursive_mutex。我是否遗漏了标准中的某些内容,还是我必须再等三年才能获得标准版本?如果目前没有这样的设施,那么仅使用标准C++来简单(第一优先)和高效(第二优先)实现这样的功能是什么? 最佳答案 Recursive互斥

c++ - x86(_64) 上的原子计数器和自旋锁的成本

前言我最近遇到了一些同步问题,这导致我访问了spinlocks和atomiccounters.然后我又搜索了一下,这些是如何工作的,发现std::memory_order和内存屏障(mfence、lfence和sfence)。所以现在看来​​,我应该对自旋锁使用acquire/release,对计数器使用relaxed。一些引用x86MFENCE-MemoryFencex86LOCK-AssertLOCK#Signal问题默认情况下,这三个操作(锁定=test_and_set,解锁=clear,增量=operator++=fetch_add)的机器代码是什么(编辑:见下文)(seq_c

c++ - 在多线程 C++ 应用程序中,我是否需要互斥锁来保护简单的 boolean 值?

我有一个多线程C++应用程序,它使用OpenSceneGraph库进行3D渲染。我计划使用boost::threads将OSG的渲染循环作为一个单独的线程启动,将包含共享状态的数据结构传递给线程。我试图避免任何过于重量级的东西(如互斥锁)进行同步,因为渲染循环需要非常紧凑,而OSG本身试图避免不得不锁定。大多数共享状态是在线程启动之前设置的,并且永远不会改变。我确实有一些需要更改的数据,我计划对其进行双重缓冲。但是,我有一个简单的boolean值,用于指示线程暂停渲染,然后恢复渲染,另一个用于终止它。在这两种情况下,应用程序线程都会设置boolean值,而渲染线程只读取它。我需要同步对

c++ - 用于创建锁层次结构的实用程序?

根据ThreadsandsimpleDeadlockcure中的答案还有HerbSutter避免死锁的关键是使用锁层次结构。是否有任何好的C++库对此提供支持?我在Boost或Poco中找不到任何东西。理想情况下,它应该是一个允许在编译时定义层次结构的系统。也许它看起来像这样:templateclassRankedMutex{...};classBottomMutex{...};typedefRankedMutexL1Mutex;typedefRankedMutexL2Mutex;typedefRankedMutexL3Mutex;//... 最佳答案

c++ - 如果您以原子方式更改检查值,条件变量是否仍需要互斥锁?

这是使用条件变量的典型方式://Thereader(s)lock(some_mutex);if(protected_by_mutex_var!=desired_value)some_condition.wait(some_mutex);unlock(some_mutex);//Thewriterlock(some_mutex);protected_by_mutex_var=desired_value;unlock(some_mutex);some_condition.notify_all();但是,如果protected_by_mutex_var是通过比较和交换指令原子设置的,那么互斥

c++ - 在线程 A 中创建对象,在线程 B 中使用。需要互斥锁吗?

我一直在阅读有关多线程、C++、正确同步和防止竞争条件的锁的不同内容。但是,我没有回答一个问题:如果我在线程A中创建了一个对象,但之后只在线程B中使用它,是否需要互斥锁?换句话说,我知道我不需要互斥锁来防止竞争条件-我是否需要互斥锁来充当内存屏障(或其他潜在问题)?一个非常基本的例子来形象化我的意思structObject{voiddo_stuff();};Objecto;std::threadworker_thread([&o](){while(alive)o.do_stuff();}).join();//`o`isneverusedoutsideworker_thread如果您还可

c++ - 没有互斥锁的事件通知

C++11有std::condition_variable,它的等待函数是templatevoidwait(std::unique_lock&lock,Predicatepred);它需要一个互斥体。据我了解-它的notify_one可以在不同步的情况下调用(我知道惯用的方法是将它与互斥锁一起使用)。我有一个对象,它已经在内部同步-所以我不需要互斥锁来保护它。一个线程应该等待与该对象关联的某个事件,而其他线程会收到通知。在C++11中如何在没有互斥体的情况下进行此类通知?IE。使用condition_variable很容易,但它需要一个互斥锁。我想过用一个假的互斥类型,但是std::m

c++ - 第一次锁定和创建 lock_guard(adopt_lock) 和创建 unique_lock(defer_lock) 和锁定有什么区别?

我找到了以下两段代码:http://en.cppreference.com/w/cpp/thread/lockvoidassign_lunch_partner(Employee&e1,Employee&e2){//usestd::locktoacquiretwolockswithoutworryingabout//othercallstoassign_lunch_partnerdeadlockingus{//misthestd::mutexfieldstd::unique_locklk1(e1.m,std::defer_lock);std::unique_locklk2(e2.m,st

c++ - 一个用户崩溃时共享内存中的互斥锁?

假设一个进程正在共享内存中创建一个互斥体并锁定它并在互斥体被锁定时转储核心。现在在另一个进程中,我如何检测互斥锁已被锁定但不属于任何进程? 最佳答案 似乎已经以强大的互斥锁的形式提供了确切的答案。根据POSIX,可以使用pthread_mutexattr_setrobust()将pthread互斥锁初始化为“稳健”。如果持有互斥锁的进程死了,下一个获取它的线程将收到EOWNERDEAD(但仍然成功获取互斥锁),以便它知道执行任何清理。然后它需要使用pthread_mutex_consistent()通知获取的互斥体再次一致。显然,您