我在QNX IDE中使用C++編寫的應用程序中的多個線程中使用了一些函數。有時在分析日誌時,很難找到調用它的線程。儘管我可以在日誌中使用gettid或pthread_getname_np,但仍然在尋找像 __LINE__這樣的標準宏。像'__LINE__'一樣,C/C++中是否有標準的宏,可以打印線程名稱或ID?
即使它不被QNX支持,我想知道是否有任何其他OS /編譯器/標準有它。
我在QNX IDE中使用C++編寫的應用程序中的多個線程中使用了一些函數。有時在分析日誌時,很難找到調用它的線程。儘管我可以在日誌中使用gettid或pthread_getname_np,但仍然在尋找像 __LINE__這樣的標準宏。像'__LINE__'一樣,C/C++中是否有標準的宏,可以打印線程名稱或ID?
即使它不被QNX支持,我想知道是否有任何其他OS /編譯器/標準有它。
即使通過預處理器,行的行號在編譯時也是已知的,所以預處理器可以用__LINE__
替換實際的行號。
但是,只有在運行時才知道線程ID,而且對於同一語句的不同執行,它也會不同。所以它不可能是一個宏的價值。
您正好需要使用類似於您提到的那種運行時調用來發現線程ID。您可能需要一個特定於平臺的機制,因爲Posix和C都沒有定義一個可移植機制來獲取線程ID。從C++ 11開始,您可以使用std::this_thread::get_id()
來獲取獨特的可打印thread id。
不,因爲不像__LINE__
線程ID不是在編譯時靜態確定的。此外,線程不是C或C++語言的一部分,因此編譯器不知道它們 - 在任何情況下(即使C++ 11支持通過標準庫的線程),您都必須進行調用以確定線程ID。
如果你真的必須,這總是可以用宏僞造:
#define __THREAD__ gettid()
或C++ 11:
#define __THREAD__ std::this_thread::get_id()
或者是其他系統獲得一個線程或進程ID是依賴手段由目標提供 - 它不是完全可移植的,儘管一旦支持無處不在,C++ 11就提供了可移植性的最佳可能性。
但這樣做隱藏函數調用的開銷,並使其看起來像一個文字常量,我不確定我會主張誤導代碼。此外,保留使用__
,所以它更具誤導性。
如果您對線程的標識句柄感到滿意,則第一個參數返回到pthread_create()
的相同值也可以通過運行線程調用pthread_self()
來獲得。 這是由計時狐狸
指出,在評論如果僅創建靜態組線程,你想每一個序號值相關聯,你可以使用一個static
計數器和一個線程局部變量。在創建每個線程時,原子讀取和遞增計數器,並將線程局部變量設置爲讀取值。
該id是運行時間特定的,因此不會有類似於編譯時已知的\ _ \ _ LINE \ _ \ _的標準宏。 –
引用「* standard *」:'gettid()'不是標準C,'pthread_getname_np()'是POSIX。使用'pthread_self()'。 – alk
您可以使用'pthread_self()'來獲得標準的'pthread_t'實例。或者,使用包含「pthread_t」成員和ID(例如結構變量的地址)的包裝器結構,並且可以在創建線程時將該地址傳遞給啓動例程。 –