1

を使用して、次のロジック (一種の疑似コード) を実装しようとしていますpthread

pthread_mutex_t mutex;

threadA()
{
    lock(mutex);
    // do work
    timed_lock(mutex, current_abs_time + 1 minute);
}

threadB()
{
    // do work in more than 1 minute
    unlock(mutex);
}

私はthreadA仕事をして信号が来るまで待つつもりですがthreadB、1分以内です。私はWin32で同様のことを何度もしましたが、pthreadsに固執しました。timed_lock一部は code ですぐに(1分ではなく)戻りますETIMEDOUT

上記のロジックを実装する簡単な方法はありますか?

次のコードでもETIMEDOUTすぐに戻ります

pthread_mutex_t m;
// Thread A
pthread_mutex_init(&m, 0);
pthread_mutex_lock(&m);
// Thread B
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
struct timespec time = {now.tv_sec + 5, now.tv_nsec};
pthread_mutex_timedlock(&m, &time); // immediately return ETIMEDOUT

誰かが理由を知っていますか?私もgettimeofday関数で試しました

ありがとう

4

3 に答える 3

0

このようなことを試してください:

class CmyClass
{
   boost::mutex mtxEventWait;
   bool WaitForEvent(long milliseconds);
   boost::condition cndSignalEvent;
};

bool CmyClass::WaitForEvent(long milliseconds)
{
   boost::mutex::scoped_lock mtxWaitLock(mtxEventWait);
   boost::posix_time::time_duration wait_duration = boost::posix_time::milliseconds(milliseconds); 
   boost::system_time const timeout=boost::get_system_time()+wait_duration; 
   return cndSignalEvent.timed_wait(mtxEventWait,timeout); // wait until signal Event 
}

// そのため、待機するために WaitForEvent メソッドを呼び出します

WaitForEvent(1000); // it will timeout after 1 second

// イベントを通知する方法は次のとおりです。

cndSignalEvent.notify_one();
于 2016-11-30T09:28:58.083 に答える