2010-03-10 69 views
4

我正在使用ACE線程,並且需要每個線程都有自己的int成員。 這可能嗎?有沒有辦法在使用ACE時使用線程局部變量?

+0

出於好奇,你真的需要使用TSS嗎?你可以簡單地在線程堆棧中聲明變量,或者你在尋找一些方法來阻止其他線程訪問你的變量嗎?如果後者,爲什麼不使用鎖?有些人認爲TSS主要是傳統接口的柺杖(例如,使errno線程安全),並且鎖定是更好的方法。我不主張這個或那個。因人而異。 – Void 2010-03-10 22:11:22

+0

我認爲TSS實際上是這種情況下最優雅的解決方案。我有n個線程,每個線程都應該有自己的變量(有自己的值)。 – amitlicht 2010-03-10 22:44:18

+1

您提到希望每個線程都有自己的「成員」。這表明你正在使用類來表示你的線程。如果是這樣,那麼簡單地給這個類一個正常的成員變量。每個線程都有自己的類實例,所以它也有它自己的單獨的成員變量。 – 2010-03-11 01:06:23

回答

2

ACE稱之爲「線程專用存儲」。看看這個:ACE_TSS。這就是我所知道的全部,對不起沒有更多的幫助。

thread-local storage的維基百科頁面說,也有一個pthreads的方式來做到這一點。

+0

它有時在pthread中調用TSS或TSD(線程特定的數據)。以下鏈接介紹瞭如何使用pthreads API創建此類數據:http://www.opengroup.org/onlinepubs/000095399/functions/pthread_key_create.html。在UNIX/UNIX-like平臺上,ACE僅使用引擎內的pthread。 – Void 2010-03-10 21:44:50

0

其平臺特定。例如Windows應該使用__declspec(thread)。編譯器會利用TLS API(TlsAlloc,TlsFree和朋友),而在Win32上你不應該總是使用FLS(光纖本地存儲)而不是TLS,但TLS API無論如何都會在任何現代的Win32版本上默默地​​將你重定向到FLS。

0

是的。您可以使用ACS_TSS<type>模板,該模板專爲「線程專用存儲」(即:線程局部變量)而設計。

詳情請參閱docs on ACE_TSS

+0

你知道我可以如何設置所有線程的初始值? – amitlicht 2010-03-10 22:38:05

0

沒有辦法讓ACE_TSS爲所有線程設置初始值;你可以在線程函數輸入後輕鬆設置初始值。

相關問題