2017-03-01 86 views
-2

我有一些库代码有时需要运行多线程,但更通常单线程。这是一组非常频繁调用的小例程。以前的经验和分析表明额外的延迟可能会对性能造成不利影响,所以我想避免不必要的开销。c + + 03空指针与空对象模式:性能影响

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

我在运行多线程时保护例程的首选方法是使用有限范围的互斥锁。我最初的想法是沿着this SO answer的路线。

但是大多数情况下,这些例程都是单线程运行的,我不喜欢空指针检查的开销。这是在一个非常缓慢的ARM9处理器上运行的,每个周期都会计数。

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

回答

3

我觉得这里有一些信息没有真正给出最好的答案,但我根本没有看到任何理由在这里使用指针。据推测,你正在调用一些库代码,比方说这是一个叫做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不会有任何开销。