2012-12-27 9 views
12

次の警告は、テストごとに生成され、Googleのテストフレームワークを使って書かれた死のテストを実行している:Google TestでLinux上のスレッド数を検出するにはどうすればよいですか?

[WARNING] .../gtest-death-test.cc:789:: Death tests use fork(), which is unsafe 
particularly in a threaded context. For this test, Google Test couldn't detect 
the number of threads. 

Googleのテストは、Linux上のスレッド数を検出するようにする方法はありますか?

+1

Googleの巧妙な人々は、それが簡単ならそれをする方法を知っているだろうと思いますか? ;) –

+2

@MatsPetersson:まあ、時にはやりにくいことが多すぎます。 – vitaut

答えて

11

私はソースコードを見て、スレッド数の検出はMacOS XとQNXのみで実装されているが、Linuxや他のプラットフォームでは実装されていないことが判明した。だから私は/proc/self/taskのエントリの数を数えることで自分自身に欠けている機能を実装しました。

2015年8月25日のよう
size_t GetThreadCount() { 
    size_t thread_count = 0; 
    if (DIR *dir = opendir("/proc/self/task")) { 
    while (dirent *entry = readdir(dir)) { 
     if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) 
     ++thread_count; 
    } 
    closedir(dir); 
    } 
    return thread_count; 
} 

、Googleのテストimplements GetThreadCount on Linux:それは私がそれをここに掲示しています他の人のために有用であるかもしれないので(私もGoogle Test groupにそれを送信した)

size_t GetThreadCount() { 
    const string filename = 
     (Message() << "/proc/" << getpid() << "/stat").GetString(); 
    return ReadProcFileField<int>(filename, 19); 
} 
+0

全てのエントリが数値なので、strcmpへの2回の呼び出しではなく、 'if(entry-> d_name [0]!= '。')...'それは本当に問題ではありません... –

+1

私はあなたのソリューションが好きです。 –

+0

@MatsPetersson:ありがとう。あなたはパフォーマンスについて正しいですが、とにかく遅い死のテストのためだけです。 – vitaut

4

の場合

::testing::FLAGS_gtest_death_test_style = "threadsafe"; 

詳細hereを:あなたは、テストの実行時間についてはあまり気にしない、便利な代替が使用することです。

+1

私はテストの実行時間を気にしますが、答えに感謝します。このオプションについては知らなかった。 – vitaut

+0

コマンドライン引数として渡すこともできます: '--gtest_death_test_style = threadsafe' – psur

関連する問題