私はJavaとC++でコード化したアプリケーションを持っています。 このアプリケーションでは、正確にN秒間持続する複数の「試行」が必要です(N = 15としましょう)。 私が必要とするのは、0.005秒ごとに現在の状態を記録することです。私は、次のコードを持っている、まさにこの目的のために :2つのスレッドが同時に起動することを確認してください。
私は私が(ログラインの異なる数を取得することがわかり(そのファイルに書かれている)私のログで探していたときのものがあるstd::thread timerTrial(&endTrial,this);
std::thread timerLog(&log,this);
std::thread timerTrial(&endTrial,this);
timerLog.detach();
timerTrial.detach();
void endTrial(){
usleep(TIME);
isOver = true ;
//...
}
void log(){
while(isOver == false){
usleep(TIMELOG);
//Do the logging
}
}
1つの試行ではログが14.5秒、もう1つは14.3秒、もう1回は14.8秒までログが記録されます。このコードを改善して各試行の差異を少なくする方法はありますか?
私はlog()
で行わなければならないロギングが少し遅れているかもしれないと思っていますが、正に、本当に小さなロギング(主にstd :: vectorへの追加)です。 log()
機能の私のwhile
ループで時間を無駄にしないように、このログを行うために他の並列スレッドを作成する必要がありますか?
私はこの試行の違いを減らすために、このコードを改善するためのアイデアが不足しています。私の質問が十分にはっきりしていればいいと思うそれ以上の説明を求めないようにコメントしてください。事前に
おかげで、
両方のスレッド関数の開始時に待機し、特定の時点でメインスレッドから解放される条件変数を使用できます。 –
@πάνταῥεῖASAP – LBes
でもそうしようとしていますが...スレッドプリエンプションの決定論は、使用中のスケジューラに完全に依存しません。これはOSの問題であり、言語の問題ではありません。 –