web-dev-qa-db-ja.com

C ++ gettid()はこのスコープで宣言されていません

簡単なプログラムは次のとおりです。このgettid関数を使用して、両方のスレッドのスレッドIDを取得したいと思います。 sysCallを直接実行したくありません。この機能を使いたい。

#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/date_time/date.hpp>
#include <unistd.h>
#include <sys/types.h>
using namespace boost;
using namespace std;

boost::thread thread_obj;
boost::thread thread_obj1;

void func(void)
{
    char x;
    cout << "enter y to interrupt" << endl;
    cin >> x;
     pid_t tid = gettid();
    cout << "tid:" << tid << endl;
    if (x == 'y') {
        cout << "x = 'y'" << endl;    
        cout << "thread interrupt" << endl;
    }
}

void real_main() {

   cout << "real main thread" << endl;
    pid_t tid = gettid();
    cout << "tid:" << tid << endl;

    boost::system_time const timeout = boost::get_system_time() + boost::posix_time::seconds(3);
    try {
        boost::this_thread::sleep(timeout);
    }
    catch (boost::thread_interrupted &) {
        cout << "thread interrupted" << endl;
    }

}

int main()
{
    thread_obj1 = boost::thread(&func);
    thread_obj = boost::thread(&real_main);
    thread_obj.join();
}

コンパイル時にエラーが発生します。 gettid()の使用は、マニュアルページに従って行われました。

$g++ -std=c++11 -o Intrpt Interrupt.cpp -lboost_system -lboost_thread
Interrupt.cpp: In function ‘void func()’:
Interrupt.cpp:17:25: error: ‘gettid’ was not declared in this scope
      pid_t tid = gettid();
14
Hiesenberg

これはばかげたglibcのバグです。このように回避します:

#include <unistd.h>
#include <sys/syscall.h>
#define gettid() syscall(SYS_gettid)
28
Glenn Maynard

あなたが参照しているマニュアルページはオンラインで読むことができます ここ 。それは明確に述べています:

:このシステムコールにはglibcラッパーはありません。注を参照してください。

そして

[〜#〜] notes [〜#〜]

Glibcは、このシステムコールのラッパーを提供していません。 syscall(2)を使用して呼び出します。

この呼び出しによって返されるスレッドIDは、POSIXスレッドID(つまり、pthread_self(3)によって返される不透明な値)と同じものではありません。

だからあなたはできません。この関数を使用する唯一の方法は、syscallを使用することです。

しかし、とにかくそうすべきではないでしょう。代わりにpthread_self()を使用できます(そしてpthread_equal(t1, t2)を使用して比較します)。 boost::threadにも同等のものがあります。

5
user743382