2010-10-07 83 views
2

谷歌搜索沒有找到任何東西。它們是在使用時創建的,還是實例之間共享的通用部分?C++模板函數是否是線程安全的?

(模板類相同嗎?)

+2

答案是「否」。現在問題變成了,你知道什麼是「線程安全」真的意味着什麼嗎? – 2010-10-07 22:15:08

+0

@John Dibling:其他人比我能解釋得更好;請看這裏:http://en.wikipedia.org/wiki/Thread_safety – slashmais 2010-10-07 22:25:36

+1

他不是要求教科書定義線程安全性,而是要求你理解這個術語。維基百科沒有告訴我們,這在回答這個問題時很重要。 – jalf 2010-10-07 23:03:39

回答

11

模板函數是在編譯時創建的。模板屬性與線程安全完全正交。

+0

這聽起來很酷,但這是什麼意思? :-) – DarkDust 2010-10-07 22:10:07

+2

只是在以下情況下還不夠清楚:C++模板被稱爲「代碼生成器」。這意味着,當編譯器遇到模板時,它會爲您在該模板中使用的每種類型創建一套全新的機器指令。正因爲如此,你最終會得到兩個完全獨立的函數。 int函數()在機器級別上與int函數()完全不同,即使它們執行相同的操作。所以,他們的局部變量確實是線程安全的(不同的堆棧框架),但沒有其他的東西。 – Bryan 2010-10-07 22:12:46

+0

@Bryan:爲typedef'd類型創建不同的堆棧框架嗎?我對編譯器內部的知識有點不穩定。 – slashmais 2010-10-07 22:18:33

2

模板功能只是......所使用的編譯器生成「正常」的功能模板。所以它和普通功能一樣,沒有區別。

6

它們沒有比任何其他類型的函數更多或更少的線程安全。

+0

+1:換句話說,沒有。 – 2010-10-07 22:13:48

+3

@John Dibling:換句話說,* mu *。 http://www.catb.org/jargon/html/M/mu.html – 2010-10-07 22:21:05

+0

@Shmoopty:好多了 – 2010-10-07 23:22:46

3

我能想到的線程安全的唯一方法受着是,如果someMethod<typename T>()不是線程安全的,然後它仍然會好起來的一個線程上運行someMethod<int>()同時someMethod<std:string>()其他工作,只要缺乏線程安全性並非來自它們都調用某些非模板化功能。

哪裏別的東西是保證只有一個線程正在做一個特定的任務,並以每次一個特定類型的情況似乎不太可能,但。