私はスレッド同期を学習しています。これは、スレッドの実行中に重要なデータをロックする方法を示すデモです。
http://ideone.com/7Do0l
(このコードを実行するには-pthread
、Linux/MacOS 環境でパラメーターを指定してコンパイルします)
プログラムは期待どおりに動作しますが、sleep()
関数はスレッド間の実行を一時停止しません。私の考えは、一度に 1 つのスレッドで計算を行い、1 秒後に別のスレッドが実行されるようにすることです。これが私が戦っているコードセグメントです:
while(1) {
//sleep(1); //(1) (Sleep for one second)
sem_wait(&mutex);
//sleep(1); //(2)
printf("Thread #%d is doing math. %d + 1 = %d.\n", (int) id, s, s+1);
s++;
//sleep(1); //(3)
sem_post(&mutex);
//sleep(1); //(4)
}
私が入れようとした 4 つの位置がありますsleep()
。(1) と (4) では、単一のスレッド間では一時停止が発生しませんが、10 スレッドの 2 つの束の間に一時停止が発生します。(2) と (3) は、別のスレッドが呼び出される前に、1 つのスレッドが非常に長い時間繰り返し実行される結果となります。
これに対する救済策はありますか?
アップデート
プログラムに結果を生成させるトリックがあります: 各スレッドのスリープ時間をランダムに生成しますが、2 つの乱数が偶然に同じになる可能性があるため、一貫性がありません。