-1

関数 foo() を一定期間だけ実行するにはどうすればよいですか? 実装の最も一般的な方法はスレッドだと思います。

bind と timed_join を使用するにはどうすればよいですか??

4

3 に答える 3

3

コードは他のコードと競合していません。コードは協力して仕事を成し遂げます。1 分間だけ実行する場合fooは、1 分間だけ実行するようにコーディングします。他の方法でコーディングしてから、コーディングされた方法以外の方法で強制的に動作させようとしないでください。

fooスレッドを使用する場合は、同期された「中止」フラグをチェックするようにコーディングできます。fooフラグが設定されていることに気付いた場合、中止します。次に、1 分後に、別のスレッドからそのフラグを設定します。次にfoo、フラグが設定されていることに気づき、それ自体を中止します。

I/O 操作のブロックなどを中止する必要がある場合、ソリューションはプラットフォーム固有です。または、 Boostなど、そのような機能を提供するポータブル ライブラリを使用することもできます。

于 2012-06-29T00:13:46.407 に答える
2

あなたが何を求めているのか正確にはわかりません。何かを 1 分間実行するだけの関数が必要な場合は、while ループでラップできますか?

void foo(void)
{
    time_t end = time(NULL) + 60;
    while (time(NULL) <= end)
    {
        … // do something
    }
}
于 2012-06-29T00:15:58.103 に答える
0

関数 foo() を一定期間だけ実行するにはどうすればよいですか?

POSIX pthreadAPI はキャンセルをサポートしていますが、標準では即時のキャンセルは保証されていません。ただし、以下は、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_joinboost::bind引数を取らず、引数が渡された関数を呼び出すファンクターを定義するメカニズムを提供します。boost::thread引数を取らないファンクターが必要なので、そこで使用されます。

boost::thread t(boost::bind(puts, "hello, world"));

boost::thread::timed_joinboost::thread渡された時間パラメータ内にスレッドが終了しなかった場合に false を返す可能性のある の結合です。

boost::thread t(foo);
t.timed_join(boost::posix_time::seconds(1));
于 2012-06-29T06:34:22.527 に答える