- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题背景
有问题的代码与 C++ 实现有关。我们有代码库,其中对于某些关键实现,我们使用 asm volatile ("mfence":"memory")
。
我对内存障碍的理解是——
问题
pthread_mutext
是否比内存屏障更快?我已阅读表明 pthread mutex uses memory synchronization 的内容. 附言:
在我们的代码中,asm volatile ("mfence":"memory")
的使用是在 10-15 行 c++ 代码(成员函数)之后使用的。所以我怀疑 - 可能是内存同步的互斥实现提供了比用户实现代码中的 MB 更好的性能(w.r.t MB 范围)。
我们使用的是 SUSE Linux 10、2.6.16.46、smp#1、x64_86 和四核处理器。
最佳答案
pthread 互斥量保证比内存栅栏指令慢(我不能说慢多少,这完全取决于平台)。原因很简单,因为为了兼容 posix 互斥锁,它们必须包含内存保证。 posix 互斥锁具有强大的内存保证,因此我看不出如果没有这样的栅栏*它们将如何实现。
如果您正在寻找实用的建议,我会在很多地方使用栅栏而不是互斥锁,并且经常对它们进行计时。与原始内存栅栏相比,pthread_mutex 在 Linux 上非常慢(当然,它们做的更多,所以要小心你实际比较的内容)。
但是请注意,某些原子操作,尤其是 C++11 中的原子操作,可以而且肯定会比全面使用栅栏更快。在这种情况下,编译器/库了解架构,不需要使用完整的栅栏来提供内存保证。
另请注意,我说的是锁本身的非常低级的性能。您需要分析到纳秒级别。
*可以想象一个互斥系统忽略某些类型的内存并选择更宽松的锁定实现(例如依赖正常内存的顺序保证和忽略特殊标记的内存)。然而,我认为这样的实现是无效的。
关于c++ - pthread_mutex 锁是否提供比用户在代码中施加的内存屏障更高的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383055/
我不明白为什么在这段代码中我遇到了死锁。我已经定义了这个互斥体: 互斥锁3:= 0(锁定) 互斥锁2:= 1(解锁) 我有 2 个进程:父亲和儿子。每个线程都有 N 个线程,我通过参数传递这些线程。子
我有以下代码: bool Mutex::timed_lock(unsigned long milliseconds) { if (!milliseconds) { re
问题背景 有问题的代码与 C++ 实现有关。我们有代码库,其中对于某些关键实现,我们使用 asm volatile ("mfence":"memory")。 我对内存障碍的理解是—— 用于确保指令集的
在使用 pthread_mutex_t 之前,应该调用 pthread_mutex_init(),在不再需要它之后,应该使用 pthread_mutex_destroy() 销毁它。 我的问题是,如果
使用 pthreads 在获得锁之前必须在任何互斥体上调用 pthread_mutex_init()。 根据 POSIX,锁定未初始化的互斥量仅针对具有优先级保护的互斥量 (opengroup : p
我目前正在阅读操作系统:三篇简单的文章,我开始了解并发背后的逻辑。在第 26 个“章节”中,我们得到了这个线程示例和围绕原子性的问题: #include #include #include st
我已经搜索了很多小时来寻找解决方案,但找不到简单的答案。我有一个类,它使用 pthreads。实际的函数指针在类中是静态的,我需要锁定互斥体,因为到目前为止我得到了“奇怪”的结果(参数未正确传递)。
我目前正在尝试使用 pthread_mutex 模型在 Linux 中同步两个进程。 这是我正在处理的代码: #include #include #include #include using
我正在尝试在 Linux 中使用基于健壮的 futex 的 pthread 互斥体,因为我需要既快速又健壮(恢复“死”锁)。我如何检查任何 Linux 系统上的 pthread 互斥库是否基于健壮的
我尝试在 pthread_mutex 上创建一个包装器,该包装器维护当前线程持有的所有互斥锁的列表。但是,我也使用了某些库代码,对此我不可能使用这个包装器。有什么办法可以得到这个通用 pthread_
我用 C 和 Java 编写了完全相同的程序,其中两个线程递增全局计数器。为了确保 C 中计数器访问的排他性,使用了 pthread_mutex_t,而在 Java 中则使用 synchronized
在 pthread_mutex_init 等接口(interface)的手册页中, int pthread_mutex_init(pthread_mutex_t *restrict mutex,
根据手册页 pthread_mutex_lock locks the given mutex. If the mutex is currently unlocked, it becomes locke
boost::details::pool::pthread_mutex 和 boost::details::pool::null_mutex 有什么区别。 我看到在最新的 boost 版本 - 1.4
我现在正在学习多线程编程,我注意到使用互斥锁实现同步的程序在 Mac OS X 上非常慢,在某种程度上通常最好使用单线程。我知道有更快的同步方式,但我仍然想知道为什么会这样。为了简单的时间测量,我写了
我是一名优秀的程序员,十分优秀!