2017-03-01 85 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不會有任何開銷。