试图建立一个"模拟" Reentrant mutex,我需要一个每个线程都有的标识符。我可以通过thread::current
获取当前主题,但Thread
似乎没有任何可以作为标识符使用(或滥用)的内容。
就我的目的而言,我相信一旦线程退出就可以重用标识符,尽管我也会对那些没有重用标识符的答案感兴趣,因为这些标识在其他情况下可能会有用。
答案 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中得到纠正。