【问题标题】:c++03 null pointer versus null object pattern: performance implications [closed]c++03空指针与空对象模式:性能影响[关闭]
【发布时间】:2017-03-01 22:34:15
【问题描述】:

我有一些库代码有时需要多线程运行,但更常见的是单线程。这是一组被非常频繁地调用的小例程。以前的经验和分析表明,额外的延迟可能会损害性能,所以我想避免不必要的开销。

我无法为单线程和多线程使用提供单独的库实例,也无法为单线程版本提供线程安全包装器。这两个限制都是由于库的设计。

在运行多线程时保护例程的首选方法是使用作用域互斥锁。我最初的想法是this SO answer

但是大多数时候例程都是单线程运行的,我不喜欢空指针检查的开销。这是在非常慢的 ARM9 处理器上运行的,每个周期都很重要。

在实践中,我可能会使用空指针检查和配置文件来查看它的成本,但我想知道是否有更好的方法。例如空对象模式,或者让库调用回调。

【问题讨论】:

    标签: c++ multithreading c++03


    【解决方案1】:

    我觉得这里缺少一些信息来真正给出最佳答案,但我真的看不出有任何理由在这里使用指针。假设您正在调用一些库代码,假设它是一个名为void foo(int) 的函数。您无法更改此代码,而且它不是线程安全的。但是你可以改变你的代码,对吧?不要调用您的代码,而是调用 foo 周围的包装器:

    template <class M>
    void foo_wrapper(M& mutex, int x); { std::lock_guard(mutex); foo(x); }
    

    现在,您可以简单地编写一个简单的无操作互斥锁:

    struct NoMutex {
      void lock() {}
      bool try_lock() { return true; }
      void unlock() {}
    };
    
    std::mutex m1;
    NoMutex m2;
    foo_wrapper(m1, 0);  // thread safe
    foo_wrapper(m2, 0);  // thread unsafe
    

    因为编译器知道这些类型,所以第二次调用foo_wrapper 不会有任何开销。

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 2020-12-24
      相关资源
      最近更新 更多