草庐IT

c++ - 与 `std::mutex` 同步是否比与 `std::atomic(memory_order_seq_cst)` 慢?

在互斥体上使用原子的主要原因是互斥体很昂贵,但是atomics的默认内存模型是memory_order_seq_cst,这不是一样昂贵吗?问题:使用锁的并发程序能否与并发无锁程序一样快?如果是这样,除非我想将memory_order_acq_rel用于原子,否则可能不值得付出努力。编辑:我可能遗漏了一些东西,但基于锁的不能比无锁更快,因为每个锁也必须是一个完整的内存屏障。但是对于无锁,可以使用比内存屏障限制更少的技术。回到我的问题,无锁是否比基于新C++11标准和默认memory_model的锁更快?“以性能衡量时,无锁>=基于锁”是真的吗?假设有2个硬件线程。编辑2:我的问题不是关于

c++ - 在 C++11 中总是将 std::mutex 声明为可变的?

看完赫伯·萨特的演讲后YouDon'tKnowconstandmutable,我想知道我是否应该始终将互斥锁定义为可变的?如果是,我猜对于任何同步容器(例如,tbb::concurrent_queue)也是如此?一些背景:在他的演讲中,他说const==mutable==线程安全,以及std::mutex根据定义是线程安全的。演讲还有相关问题,Doesconstmeanthread-safeinC++11.编辑:Here,我发现了一个相关的问题(可能是重复的)。不过,在C++11之前就有人问过了。也许这会有所作为。 最佳答案 不。但

c++ - std::mutex 与 std::recursive_mutex 作为类成员

我看到有人讨厌recursive_mutex:http://www.zaval.org/resources/library/butenhof1.html但是当考虑如何实现一个线程安全的类(互斥保护)时,在我看来很难证明每个应该受互斥保护的方法都是互斥保护的,并且互斥最多被锁定一次。所以对于面向对象的设计,应该std::recursive_mutex是默认的,而std::mutex在一般情况下被认为是一种性能优化,除非它只用于一个地点(只保护一种资源)?为了清楚起见,我说的是一个私有(private)的非静态互斥体。所以每个类实例只有一个互斥体。在每个公共(public)方法的开头:{s

C++11 等价于 boost shared_mutex

boost::shared_mutex是否有C++11等效项。或者在C++11中处理多读/单写情况的另一种解决方案? 最佳答案 我尝试过但未能将shared_mutex导入C++11。它已被提议用于future的标准。建议是here.编辑:修订版(N3659)wasaccepted对于C++14。这是一个实现:http://howardhinnant.github.io/shared_mutexhttp://howardhinnant.github.io/shared_mutex.cpp

go - sync/mutex.go 中的 “_ = variable” 是什么意思

同步/mutex.go:func(m*Mutex)Unlock(){ifrace.Enabled{_=m.staterace.Release(unsafe.Pointer(m))}..._=m.state是什么意思?我知道var_interface=Object的意思是检查Object是否实现了接口(interface)。 最佳答案 从提交日志来看,原因是“_=m.state”确保m不为nil。commit5bb3a66a973ea87494b9197091e8c1f122080627Author:RémyOudomphengDat

linux - pthread_mutex_lock 是如何实现的

我只是想知道与线程之间的同步相关的功能是如何在Unix中实现的。例如,当我调用pthread_mutex_lock时会发生什么?有没有使用中的指针?对源代码的引用会很有帮助。 最佳答案 它既复杂又不同于Unix到Unix变体。例如,在Linux中,使用了一个名为Futex(FastUserspaceMutex的缩写)的系统。在该系统中,对用户空间中的互斥变量执行原子增量和测试操作。如果操作的结果表明没有对锁的争用,那么对pthread_mutex_lock的调用就会返回而无需上下文切换到内核中,因此获取互斥锁的操作可以非常快。只有在

c++ - 如何在不使用 <mutex> 的情况下在 C++11 中实现多线程安全单例

现在C++11具有多线程,我想知道在不使用互斥体的情况下实现延迟初始化单例的正确方法是什么(出于性能原因)。我想出了这个,但是我不太擅长编写无锁代码,所以我正在寻找一些更好的解决方案。//ConsoleApplication1.cpp:Definestheentrypointfortheconsoleapplication.//#include#include#include#includeusingnamespacestd;classSingleton{public:Singleton(){}staticboolisInitialized(){return(flag==2);}sta

c++ - boost shared_mutex(多次读取/一次写入)的示例?

我有一个多线程应用程序,它必须经常读取一些数据,并且偶尔会更新这些数据。现在,互斥锁可以安全地访问该数据,但它很昂贵,因为我希望多个线程能够同时读取,并且仅在需要更新时将它们锁定(更新线程可以等待其他线程完成).我认为这是boost::shared_mutex应该做的,但我不清楚如何使用它,也没有找到一个明确的例子。有没有人有一个简单的例子可以用来入门? 最佳答案 1800INFORMATION或多或少是正确的,但我想更正一些问题。boost::shared_mutex_access;voidreader(){boost::shar

c++ - 如何使用 std::vector<std::mutex> 之类的东西?

我有大量但可能变化的对象同时写入。我想用互斥锁保护这种访问。为此,我认为我使用了std::vector,但这不起作用,因为std::mutex没有复制或移动构造函数,而std::vector::resize()需要。这个难题的推荐解决方案是什么?编辑:是否所有C++随机访问容器都需要复制或移动构造函数来重新调整大小?std::deque有帮助吗?再次编辑首先,感谢您的所有想法。我对避免静音和/或将它们移动到对象中的解决方案不感兴趣(我不提供细节/原因)。所以考虑到我想要一个可调整数量的互斥量(当没有互斥量被锁定时保证发生调整)的问题,那么似乎有几种解决方案。1我可以使用固定数量的mut

c++ - 如何使用 std::vector<std::mutex> 之类的东西?

我有大量但可能变化的对象同时写入。我想用互斥锁保护这种访问。为此,我认为我使用了std::vector,但这不起作用,因为std::mutex没有复制或移动构造函数,而std::vector::resize()需要。这个难题的推荐解决方案是什么?编辑:是否所有C++随机访问容器都需要复制或移动构造函数来重新调整大小?std::deque有帮助吗?再次编辑首先,感谢您的所有想法。我对避免静音和/或将它们移动到对象中的解决方案不感兴趣(我不提供细节/原因)。所以考虑到我想要一个可调整数量的互斥量(当没有互斥量被锁定时保证发生调整)的问题,那么似乎有几种解决方案。1我可以使用固定数量的mut