16

私は で遊んでいてstd::thread、新しい のスレッド ID を取得する方法を知りたいと思っていましたstd::thread()。話していないstd::thread::idのは、スレッドに与えられた OS ID です ( を使用して表示できますpstree)。これは私の知る限りのものであり、Linux プラットフォームのみを対象としています (移植可能である必要はありません)。

次のように、スレッド内で Linux スレッド ID を取得できます。

#include <iostream>
#include <thread>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>

void SayHello()
{
    std::cout << "Hello ! my id is " << (long int)syscall(SYS_gettid) << std::endl;
}

int main (int argc, char *argv[])
{
    std::thread t1(&SayHello);
    t1.join();
    return 0;
}

しかし、メイン ループ内で同じ ID を取得するにはどうすればよいでしょうか。を使用する方法が見つかりませんでした std::thread::native_handlepid_t gettid(void);C++11 の実装は pthread に依存しているため、問題を解決できると信じていましたが、それは間違っているに違いありません。

アドバイスはありますか?ありがとうございました。

4

3 に答える 3

13

GCC 標準ライブラリを使用していると仮定すると、によって返される OS スレッド ID ではなく、によってstd::thread::native_handle()返されるスレッド ID が返されます。は同じ のラッパーであり、GCCは OS スレッド ID を取得する方法を提供していませんが、独自のマッピングを作成できます。pthread_tpthread_self()gettid()std::thread::id()pthread_tstd::thread

std::mutex m;
std::map<std::thread::id, pid_t> threads;
void add_tid_mapping()
{
  std::lock_guard<std::mutex> l(m);
  threads[std::this_thread::get_id()] = syscall(SYS_gettid);
}
void wrap(void (*f)())
{
  add_tid_mapping();
  f();
}

次に、次を使用してスレッドを作成します。

std::thread t1(&wrap, &SayHello);

次に、次のような ID を取得します。

pid_t tid = 0;
while (tid == 0)
{
  std::lock_guard<std::mutex> l(m);
  if (threads.count(t1.get_id()))
    tid = threads[t1.get_id()];
}
于 2013-03-29T20:49:01.463 に答える
0

これはどう:

pid_t gettid (void)
{
    return syscall(__NR_gettid);
}

http://yusufonlinux.blogspot.com/2010/11/get-thread-id-from-linux.html

__NR_gettid が unistd.h で定義されているようです

于 2013-03-29T18:26:30.173 に答える