3

非常に興味深いことをしているプログラムがあります。基本的に私は 3 つのメイン スレッドを持っています。すべてがビジーで、問題のスレッドには基本的に次のような while ループがあります。

while(variable which is always true) {
    get some data;
    process data;
    print message;
}
print end message;

現在、印刷メッセージは最初の約 400 ラウンドで印刷されますが、その後はスレッドの実行が停止します。このスレッドの優先順位を高くしてみました。他のスレッドの優先度を下げてみました。最も奇妙なことは、これは以前は機能していたのですが、別の問題 (print ステートメントでのみ行われた) をデバッグしているときに、断続的に発生し始めたことです。毎回のように、今では恒久的なものになっています。

一時的に解決した(その後、再び機能しなくなったように見える)ものは次のとおりです。

  1. 他のスレッドの print ステートメントのレベルを下げます。

  2. 他のスレッドの優先度を下げる。

  3. さまざまな時間に実行されます。

免責事項として、QNX と呼ばれるリアルタイム オペレーティング システムを使用していますが、これが問題を直接引き起こしている可能性があります。そうでなければ、大きなコアi7があり、スレッドを使用する機能がないことを願っています。

残念ながら、コードは非常に長く、作業用であるため、投稿するべきではありません。自分で解決するための正しい方向に向けてくれる助けを期待しています。これらの症状を引き起こす可能性のある問題を知っている人はいますか?

4

2 に答える 2

2

これは競合状態のように聞こえます。
デッドロックにつながる可能性があるため、ロックされたミューテックスが適切にロック解除されない状況がないことを確認してください。
残念ながら、スレッド化の問題のデバッグは非常に複雑であるため、ここではほとんど自分で行う必要があります。

于 2012-11-13T05:51:44.947 に答える
1

スレッド プログラミング:同期 - http://www.cs.cf.ac.uk/Dave/C/node31.html

これを読んで、同期までスクロールします - http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/sys_arch/kernel.html

http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/sys_arch/kernel.html#スケジューリング

同じデータがすべてのスレッドで読み取られている場合は、lock を使用します。

pthread_mutex_lock( &m );
. . .
while (!arbitrary_condition) {
    pthread_cond_wait( &cv, &m );
    }
. . .
pthread_mutex_unlock( &m );
于 2012-11-12T11:21:19.333 に答える