関数 foo() を一定期間だけ実行するにはどうすればよいですか? 実装の最も一般的な方法はスレッドだと思います。
bind と timed_join を使用するにはどうすればよいですか??
コードは他のコードと競合していません。コードは協力して仕事を成し遂げます。1 分間だけ実行する場合foo
は、1 分間だけ実行するようにコーディングします。他の方法でコーディングしてから、コーディングされた方法以外の方法で強制的に動作させようとしないでください。
foo
スレッドを使用する場合は、同期された「中止」フラグをチェックするようにコーディングできます。foo
フラグが設定されていることに気付いた場合、中止します。次に、1 分後に、別のスレッドからそのフラグを設定します。次にfoo
、フラグが設定されていることに気づき、それ自体を中止します。
I/O 操作のブロックなどを中止する必要がある場合、ソリューションはプラットフォーム固有です。または、 Boostなど、そのような機能を提供するポータブル ライブラリを使用することもできます。
あなたが何を求めているのか正確にはわかりません。何かを 1 分間実行するだけの関数が必要な場合は、while ループでラップできますか?
void foo(void)
{
time_t end = time(NULL) + 60;
while (time(NULL) <= end)
{
… // do something
}
}
関数 foo() を一定期間だけ実行するにはどうすればよいですか?
POSIX pthread
API はキャンセルをサポートしていますが、標準では即時のキャンセルは保証されていません。ただし、以下は、foo
通常は 5 秒間実行される関数を 1 秒後にキャンセルするために使用する方法を示しています。
void foo ()
{
sleep(5);
}
void * start_foo (void *)
{
int x;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &x);
foo();
return 0;
}
pthread_t t;
pthread_create(&t, 0, start_foo, 0);
sleep(1);
pthread_cancel(t);
pthread_join(t, 0);
start_foo
関数は、キャンセル状態を有効にします。x
パラメータは古いキャンセル状態を受け取ります。
bind と timed_join を使用するにはどうすればよいですか??
boost::bind
と を参照していると思いますboost::thread::timed_join
。boost::bind
引数を取らず、引数が渡された関数を呼び出すファンクターを定義するメカニズムを提供します。boost::thread
引数を取らないファンクターが必要なので、そこで使用されます。
boost::thread t(boost::bind(puts, "hello, world"));
boost::thread::timed_join
boost::thread
渡された時間パラメータ内にスレッドが終了しなかった場合に false を返す可能性のある の結合です。
boost::thread t(foo);
t.timed_join(boost::posix_time::seconds(1));