0

時間制限のあるプログラムが必要です。

そこで、alarm() 関数を使用して制限時間内にプログラムを終了しました。

しかし、同期に問題があります。

私のプログラムにはクリティカルセクションがあるため、クリティカルセクション内でタイムアウトが発生した場合、クリティカルセクションの後にアラームを延期したいと考えています。

このような:

main() {
  alarm(5);
  ...

  disable_alarm();

  //critical section; program shouldn't exit during this section
  {...} 

  enable_alarm(); //if alarm happens during it's disabled, program must exit here.

  ... 
}

disable_alarm()この場合、とにはどの関数を使用すればよいでしょうかenable_alarm()

4

2 に答える 2

2

これを行う 1 つの方法は、シグナル ハンドラをインストールすることです。

次の疑似コードのようなもの:

int alarm_received;

my_handler(int sig) {
   アラーム受信 = 1;
}

ボイド disable_alarm(ボイド)
{
  alarm_received = 0;
  シグナル (SIGALRM, my_handler);
}

ボイド (enable_alarm(ボイド))
{
  if (alarm_received)
    終了 (1);
  シグナル (SIGALRM、SIG_DFL);
}

おそらく、signal() ではなく sigaction() を使用する必要があります。

あるいは、シグナルをブロックすることの正確な意味に応じて、sigprocmask() が探しているソリューションになる場合があります。ブロックされたシグナルが保留中のままの場合、マスクが解除されたときに abd が配信されます。sigprocmask() は、問題に対するより簡単な解決策です。

于 2013-05-11T03:45:56.910 に答える
0

Linux では、poll(2)およびtimerfd_create(2 ) を使用することもできます。タイマーに到達したかどうかをいくつかの時点でテストする場合を想定しています。

于 2013-05-11T06:58:34.533 に答える