2015-09-04 144 views
0

我在QNX IDE中使用C++編寫的應用程序中的多個線程中使用了一些函數。有時在分析日誌時,很難找到調用它的線程。儘管我可以在日誌中使用gettidpthread_getname_np,但仍然在尋找像 __LINE__這樣的標準宏。像'__LINE__'一樣,C/C++中是否有標準的宏,可以打印線程名稱或ID?

即使它不被QNX支持,我想知道是否有任何其他OS /編譯器/標準有它。

+7

該id是運行時間特定的,因此不會有類似於編譯時已知的\ _ \ _ LINE \ _ \ _的標準宏。 –

+2

引用「* standard *」:'gettid()'不是標準C,'pthread_getname_np()'是POSIX。使用'pthread_self()'。 – alk

+1

您可以使用'pthread_self()'來獲得標準的'pthread_t'實例。或者,使用包含「pthread_t」成員和ID(例如結構變量的地址)的包裝器結構,並且可以在創建線程時將該地址傳遞給啓動例程。 –

回答

7

即使通過預處理器,行的行號在編譯時也是已知的,所以預處理器可以用__LINE__替換實際的行號。

但是,只有在運行時才知道線程ID,而且對於同一語句的不同執行,它也會不同。所以它不可能是一個宏的價值。

您正好需要使用類似於您提到的那種運行時調用來發現線程ID。您可能需要一個特定於平臺的機制,因爲Posix和C都沒有定義一個可移植機制來獲取線程ID。從C++ 11開始,您可以使用std::this_thread::get_id()來獲取獨特的可打印thread id

+2

值得注意的是,在特定的進程中,即使在運行時,也沒有**可移植的方式來獲取特定線程的唯一集成線程ID。一些操作系統提供了一種方式,但這些方法都不符合POSIX標準。 – tonysdg

+1

@tonysdg:C++確實有一種獲得獨特可打印線程標識符(std :: thread :: id)的可移植方式。我不知道C或Posix的等價物,但這個問題是(也)標記爲C++。 – rici

2

不,因爲不像__LINE__線程ID不是在編譯時靜態確定的。此外,線程不是C或C++語言的一部分,因此編譯器不知道它們 - 在任何情況下(即使C++ 11支持通過標準庫的線程),您都必須進行調用以確定線程ID。

如果你真的必須,這總是可以用宏僞造:

#define __THREAD__ gettid() 

或C++ 11:

#define __THREAD__ std::this_thread::get_id() 

或者是其他系統獲得一個線程或進程ID是依賴手段由目標提供 - 它不是完全可移植的,儘管一旦支持無處不在,C++ 11就提供了可移植性的最佳可能性。

但這樣做隱藏函數調用的開銷,並使其看起來像一個文字常量,我不確定我會主張誤導代碼。此外,保留使用__,所以它更具誤導性。

1

如果您對線程的標識句柄感到滿意,則第一個參數返回到pthread_create()的相同值也可以通過運行線程調用pthread_self()來獲得。 這是由計時狐狸

指出,在評論如果僅創建靜態組線程,你想每一個序號值相關聯,你可以使用一個static計數器和一個線程局部變量。在創建每個線程時,原子讀取和遞增計數器,並將線程局部變量設置爲讀取值。

相關問題