(何らかの理由で)ブロックされた時間が時間が実行に費やさとして課金されるだろうと信じてするのは難しいようだ - しかし、それがあることをオフのチャンスに、のアイデアを得るために迅速な実験を行いましょう:
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <iostream>
#include <iomanip>
std::ostream &operator<<(std::ostream &os, timeval const &t) {
return os << t.tv_sec << '.' << std::setw(6) << std::setfill('0') << t.tv_usec << std::setfill(' ');
}
int main() {
rusage r;
getrusage(RUSAGE_THREAD, &r);
std::cout << r.ru_utime << " [" << r.ru_stime << "]\n";
sleep(10);
getrusage(RUSAGE_THREAD, &r);
std::cout << r.ru_utime << " [" << r.ru_stime << "]\n";
}
結果:
0.000000 [0.000000]
0.000000 [0.000000]
ので、寝て過ごした時間は、充電されていません。 mutexで同様のテストを行うことができます:
#include <sys/time.h>
#include <sys/resource.h>
#include <iostream>
#include <iomanip>
#include <thread>
#include <mutex>
using namespace std::literals;
std::ostream &operator<<(std::ostream &os, timeval const &t) {
return os << t.tv_sec << '.' << std::setw(6) << std::setfill('0') << t.tv_usec << std::setfill(' ');
}
int main() {
rusage r;
getrusage(RUSAGE_THREAD, &r);
std::cout << r.ru_utime << " [" << r.ru_stime << "]\n" << std::flush;
std::mutex m;
m.try_lock(); // ensure mutex is locked
// create thread to unlock mutex after 5 seconds:
auto t = std::thread([&]{ std::this_thread::sleep_for(5s); m.unlock(); });
// wait for mutex to be unlocked
m.lock();
// re-check resource usage
getrusage(RUSAGE_THREAD, &r);
std::cout << r.ru_utime << " [" << r.ru_stime << "]\n";
t.join();
}
これも同様の結果が得られます。私は条件変数のためにそれを繰り返すのに気にしませんでしたが、私はそれと別の結果を見て驚くでしょう(コンデバーは常にミューテックスに関連付けられています、そして、あなたが本当に待っているミューテックスです)。
これは、I/Oの可能なすべての種類をテストしようとするあまり実用的だが、過去の経験は同じがそれで真実であることを示している:I/Oは、時間の実行として扱われていないため、時間ブロックさが待っています。
は理論的にはナノ秒の範囲で精度を向上させることができますが、スイッチを反転するか別の機能を呼び出すだけでなく、カーネルの書き換えが必要になると思います。現実的には、が多くてもをより正確に得ることができるかどうかという疑問が多くあります。ナノ秒レベルの精度が必要な場合、これはおそらく仕事のための適切な種類のツールではありません。
なぜナノ秒の精度が必要ですか?コンテキストスイッチには数マイクロ秒かかるので、すでにCSWのためにマイクロ秒の大きさのエラーがある – myaut
カーネルに 'CONFIG_SCHED_DEBUG'が設定されている場合は、スレッドの'/proc/sched_debug'で 'sum_exec_runtime'を確認しようとします – myaut