我有一個在多個項目之間共享的類,它的一些用途是單線程的,有些是多線程的。單線程用戶不需要互斥鎖的開銷,多線程用戶不希望自己進行鎖定,並希望能夠選擇以「單線程模式」運行。所以我希望能夠在運行時選擇真正的「虛擬」互斥體。在運行時選擇互斥體或虛擬互斥體
理想情況下,我會有一個shared_ptr<something>
並分配真實或虛假的互斥對象。然後我會「鎖定」這個,而不考慮它裏面的內容。
unique_lock<something> guard(*mutex);
... critical section ...
現在有一個signals2::dummy_mutex
,但它不與boost::mutex
都有一個共同的基類。
那麼,什麼是一個優雅的方式來選擇真正的互斥體和啞互斥體(信號2中的一個或其他),而不會使鎖定/守衛代碼比上面的示例更復雜?
而且,你所指出的替代品之前:
- 我可以選擇在編譯時實現,但預處理器宏是醜陋和維護項目配置對我們來說是痛苦的。
- 多線程環境中的類的用戶不希望承擔鎖定類的使用的責任,而不是讓類在內部自己執行鎖定。
- 有太多的API和現有的使用「線程安全包裝」的用法是一個實際的解決方案。
添加一個try_lock()方法,它將符合可鎖定概念以與unique_lock類一起使用。請參閱:http://www.boost.org/doc/libs/1_41_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts.lockable – 2010-02-02 04:19:41
@Jason Thx更新了這樣做。 – 2010-02-02 04:34:56
+1。這基本上是「外部多態性」,如下所述:http://www.cs.wustl.edu/~schmidt/PDF/External-Polymorphism.pdf。 – Void 2010-02-02 04:56:57