2

スレッドを起動して、一定期間内に終了したかどうかを確認するだけです。

OS:Linux; 言語:C++。

移植性のない関数(この回答で提案されているような)を使用したくない。

ミューテックスと条件変数(ここで提案されている)を使用する以外に、それを行う方法はありますか?2つのスレッド間で共有データがないため、技術的にはミューテックスは必要ありません。私が欲しいのは、スレッドを起動する関数の場合、次の場合に続行することです

  • スレッドが終了したか

  • 一定の時間が経過しました。

...そしてコードをできるだけシンプルに保ちます。

4

3 に答える 3

2

boost::thread を使用する場合、「通常の」bool フラグ、条件変数、mutex のアプローチは次のように単純です。

bool ready = false;
boost::mutex              mutex;
boost::condition_variable cv;

// function to be executed by your thread
void foo() 
{
    // lengthy calculation
    boost::mutex::scoped_lock lock( mutex );
    ready = true;
    cv.notify_one();
}

// will return, if the thread stopped
bool wait_for_foo( time_point abs_time )
{
    boost::mutex::scoped_lock lock( mutex );

    while ( !ready && cv.wait_until( lock, abs_time ) != cv_status::no_timeout )
      ;

    return ready;
}

わかりました、posixを使用するよりもはるかに簡単ではありません;-)

于 2012-07-18T13:22:40.053 に答える
1

タイマー スレッドを作成し、タイマーに達するとそのスレッドをtimeoutキャンセルできます。mutex.code は次のようにする必要はありません。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define TIMEOUT 1*60 //in secend
int count = 0;
pthread_t t_main;   //Thread id for main thread
void * timer_thread()
{
    while (TIMEOUT > count)
    {
        sleep(1);  //sleep for a secand
        count++;
    }
    printf("killinn main thread\n");
    pthread_cancel(t_main); // cancel main thread

}
void * m_thread()
{
    pthread_t t_timer; //Thread id for timer thread
    if (-1 == pthread_create(&t_timer, NULL, timer_thread, NULL))
    {
        perror("pthread_create");
        return NULL;
    }
    //DO your work...
    while(1)
    {
        sleep(2);
    }
}

int main()
{
        if ( -1 == pthread_create(&t_main, NULL, m_thread, NULL))
    {
        perror("pthread_create");
        return -1;
    }
    if (-1 == pthread_join(t_main, NULL))
    {
        perror("pthread_join");
        return -1;
    }
    return 0;
}
于 2014-02-21T20:32:20.290 に答える
0

条件変数さえ必要ありません。他のスレッドがエントリ時にミューテックスをロックし、終了時にロックを解除し、起動スレッドpthread_mutex_timedlockで (古いバージョンの POSIX ではオプション、POSIX 2008 では必須) を試してみることができます。ミューテックスを取得し、他のスレッドが終了していない場合はタイムアウトします。

于 2012-07-18T13:00:23.057 に答える