2015-11-14 81 views
-1

我正在嘗試實現一個int計數器,該計數器總是遞增一個線程(Thread1)並且總是遞減另一個(Thread2)線程安全計數器C++ 11

一個選項是使用std::atomic<int>

雖然我有另一個想法,我有兩個變量說counterIncrcounterDecrThread1總是遞增counterIncr,而線程2總是遞減counterDecr

我將用(counterIncr+counterDecr)的總和作爲我的最終結果。

這是否有任何性能優勢?這是免費的嗎?

+2

讓線程使用不共享的資源通常會更好。但是你什麼時候可以拿到這筆錢呢?線程結束後? –

+0

取決於計算最終結果的時間和位置 – Minato

+0

Hi Anon,總和總是被'Thread1'使用 – ashwin929

回答

3

如果您需要隨時可以使用的結果,那麼使用std::atomic是正確的做法,並且如果只需要「僅計數器」,那麼std::memory_order_relaxed就足夠了,這相當有效。
但是請注意,你仍然有顯着總線開銷,所以如果你做了數百萬的增量,這可能成爲一個限制因素。不要這樣做,除非您只希望總共增加幾百個增量(在這種情況下,並不重要),或者除非您真的需要能夠隨時讀取該值。

如果你需要做很多計算後最後結果,這是非常非常preferrable加入兩個線程(或阻止他們,或信號中的主線程完成後,不再寫入計數器)並且讓每個線程只更新非線性的每個線程計數器。您可以使用引用或每個引用lambda捕獲,因此消費線程可以「輕鬆」訪問結果。
這不會對公交車造成影響,而且運行速度會更快,但當然,您最終只能獲得有效的結果,而不是之前的任何時間。

+0

謝謝,我確實需要隨時查看價值,不幸的是,櫃檯可能很容易處於數百萬的數量級。所以我想用'std :: atomic'就是要走的路。 – ashwin929