2012-10-16 39 views
3

我需要從我不控制的線程中訪問線程ID(它位於異步回調函數中,並且可以從一組不同的線程中調用)。線程ID在性能方面是否很昂貴?

我想知道是否訪問線程ID在性能方面是昂貴的?

我打算從Windows使用boost::this_thread::get_id()GetCurrentThreadId()。爲了說明問題,我需要準備好一些本地緩存陣列,以便當數據從我的回調中到達時,我計劃避免錯誤並鎖定每個線程使用本地緩存,並訪問正確的緩存使用線程ID。 另外,因爲數據的大小通常不一樣,所以我不能將它放在堆棧中,而且我希望避免始終創建和刪除堆數據。

+0

我懷疑它有效果,但你可以簡單地測量這個 – nogard

+0

'boot :: threads'只是Windows上Win32線程函數的一個包裝。除了可移植性之外,兩者之間幾乎沒有什麼區別。 – Will

+0

擁有一個線程本地緩存會不會容易得多?讓編譯器擔心爲線程訪問正確的緩存。 – MSalters

回答

5

Windows將所有線程特定信息存儲在所謂的TEB中。在x86中,fs寄存器指向該結構的開始,在x64中,它是gs寄存器。

在x86窗口中,線程ID存儲在FS:[0x24],這大概應該是相當便宜的訪問。將信息存儲在線程本地存儲中涉及一個額外的間接尋址(我們從TEB獲取TLS的地址),因此它與您的手動專用緩存基本相同 - 對您來說工作量較少。