在嘗試構建「仿真」Reentrant mutex時,我需要一個對每個線程都唯一的標識符。我可以通過thread::current
獲得當前線程,但Thread
似乎沒有任何可用作(或濫用)的標識符。如何獲得唯一的線程標識符?
爲了我的目的,我相信標識符可以在線程退出後重新使用,但我也會對沒有重用標識符的答案感興趣,因爲這些答案在其他情況下可能有用。
在嘗試構建「仿真」Reentrant mutex時,我需要一個對每個線程都唯一的標識符。我可以通過thread::current
獲得當前線程,但Thread
似乎沒有任何可用作(或濫用)的標識符。如何獲得唯一的線程標識符?
爲了我的目的,我相信標識符可以在線程退出後重新使用,但我也會對沒有重用標識符的答案感興趣,因爲這些答案在其他情況下可能有用。
但
Thread
似乎沒有任何可以用作(或濫用)作爲標識符的東西。
這是通過Thread::id
在鏽1.19糾正。
儘管在線程系統中使用內置的東西會更好,但一種解決方案是跟蹤我們自己的線程ID。這些可以使用原子和線程局部變量的組合來創建:
use std::sync::atomic;
use std::thread;
static THREAD_COUNT: atomic::AtomicUsize = atomic::ATOMIC_USIZE_INIT;
thread_local!(static THREAD_ID: usize = THREAD_COUNT.fetch_add(1, atomic::Ordering::SeqCst));
fn thread_id() -> usize {
THREAD_ID.with(|&id| id)
}
// Example usage
fn main() {
println!("{}", thread_id());
let handles: Vec<_> = (0..10).map(|_| {
thread::spawn(|| {
println!("{}", thread_id());
})
}).collect();
for h in handles { h.join().unwrap() }
}
有趣的是,線程本地實現很可能有一個線程ID爲其內部工作。 –
另一種方式是,如果你可以使用libc
:
fn get_thread_id() -> libc::pthread_t {
unsafe { libc::pthread_self() }
}
pthread_t
將映射到每plattform正確的目標。
雖然這是事實,但這在Windows中很難實現。似乎有一個基於相同想法的[crate](https://crates.io/crates/thread-id),但它也是Windows兼容的。 – Shepmaster
標識符是否需要保持唯一,即使在線程結束之後,或者另一個新創建的線程是否可以重用先前已經絕跡的線程ID?對於可重入互斥體,我認爲重用不會是一個問題,但我寧願確定。 –
@MatthieuM。很好的問題!我無法考慮重用的ID如何爲我的情況造成問題,但也許我沒有足夠的努力;-) – Shepmaster