如何获得唯一的线程标识符?

时间:2016-03-20 15:14:43

标签: multithreading rust

试图建立一个"模拟" Reentrant mutex,我需要一个每个线程都有的标识符。我可以通过thread::current获取当前主题,但Thread似乎没有任何可以作为标识符使用(或滥用)的内容。

就我的目的而言,我相信一旦线程退出就可以重用标识符,尽管我也会对那些没有重用标识符的答案感兴趣,因为这些标识在其他情况下可能会有用。

3 个答案:

答案 0 :(得分:3)

另一种方法是,如果你可以使用libc

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

pthread_t将根据平台映射到正确的目标。

答案 1 :(得分: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() }
}

答案 2 :(得分:0)

  

Thread似乎没有任何可以作为标识符使用(或滥用)的内容。

这已通过Thread::id在Rust 1.19中得到纠正。