C++ c++;03空指针与空对象模式:性能影响

C++ c++;03空指针与空对象模式:性能影响,c++,multithreading,c++03,C++,Multithreading,C++03,我有一些库代码,有时需要多线程运行,但通常是单线程运行。这是一组经常调用的小例程。以前的经验和分析表明,额外的延迟可能对性能有害,因此我希望避免不必要的开销 我不能为单线程和多线程使用提供单独的库实例,也不能为单线程版本提供线程安全包装器。这两个限制都是由于库的设计 当运行多线程时,我首选的保护例程的方法是使用作用域互斥。我最初的想法是这样的 然而,大多数时候例程都是单线程运行的,我不喜欢空指针检查的开销。这是在非常慢的ARM9处理器上运行的,每个周期都计数 实际上,我可能会使用空指针检查和配置

我有一些库代码,有时需要多线程运行,但通常是单线程运行。这是一组经常调用的小例程。以前的经验和分析表明,额外的延迟可能对性能有害,因此我希望避免不必要的开销

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

当运行多线程时,我首选的保护例程的方法是使用作用域互斥。我最初的想法是这样的

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


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

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

template <class M>
void foo_wrapper(M& mutex, int x); { std::lock_guard(mutex); foo(x); }
因为编译器知道这些类型,所以对
foo\u wrapper
的第二次调用不会产生任何开销

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