2016-03-20 33 views
3

在嘗試構建「仿真」Reentrant mutex時,我需要一個對每個線程都唯一的標識符。我可以通過thread::current獲得當前線程,但Thread似乎沒有任何可用作(或濫用)的標識符。如何獲得唯一的線程標識符?

爲了我的目的,我相信標識符可以在線程退出後重新使用,但我也會對沒有重用標識符的答案感興趣,因爲這些答案在其他情況下可能有用。

+1

標識符是否需要保持唯一,即使在線程結束之後,或者另一個新創建的線程是否可以重用先前已經絕跡的線程ID?對於可重入互斥體,我認爲重用不會是一個問題,但我寧願確定。 –

+0

@MatthieuM。很好的問題!我無法考慮重用的ID如何爲我的情況造成問題,但也許我沒有足夠的努力;-) – Shepmaster

回答

0

Thread似乎沒有任何可以用作(或濫用)作爲標識符的東西。

這是通過Thread::id在鏽1.19糾正。

1

儘管在線程系統中使用內置的東西會更好,但一種解決方案是跟蹤我們自己的線程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() } 
} 
+1

有趣的是,線程本地實現很可能有一個線程ID爲其內部工作。 –

3

另一種方式是,如果你可以使用libc

fn get_thread_id() -> libc::pthread_t { 
    unsafe { libc::pthread_self() } 
} 

pthread_t將映射到每plattform正確的目標。

+1

雖然這是事實,但這在Windows中很難實現。似乎有一個基於相同想法的[crate](https://crates.io/crates/thread-id),但它也是Windows兼容的。 – Shepmaster