2016-03-20 11 views
3

"エミュレートされた" Reentrant mutexを構築しようとすると、各スレッドに固有の識別子が必要です。私はthread::current経由で現在のスレッドを得ることができますが、Threadは識別子として使用(または濫用)されているものがないようです。一意のスレッド識別子を取得するにはどうすればよいですか?

私の目的としては、スレッドが終了すると識別子を再利用できると考えていますが、識別子を再利用しなかった回答にも興味があります。

+1

スレッドが終了した後でも識別子を一意にする必要がありますか、または新しく作成された別のスレッドが以前に消滅したスレッドIDを再利用することはできますか?リエントラント・ミューテックスについては、再利用は問題ではないと考えていますが、私はむしろ確信しています。 @MatthieuM。 –

+0

。素晴らしい質問!私は再利用IDが私の場合に問題を引き起こすかもしれないと思うことができませんが、おそらく私は十分に懸命に考えていません;-) – Shepmaster

答えて

0

しかし、Threadは、識別子として使用できない(または濫用されている)ものはないようです。

これは、Thread::idによってRust 1.19で整流された。

1

スレッドシステムに組み込みのものを使用する方がはるかに良いかもしれませんが、1つの解決策は独自のスレッドIDを追跡することです。これらは、原子・スレッドローカル変数の組み合わせを使用して作成することができます:あなたはlibcを使用することができるかどう

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

もう一つの方法は、次のとおりです。

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

関連する問題