pthread:使用超时锁定互斥锁

时间:2013-11-09 20:18:40

标签: timeout pthreads mutex

我尝试使用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部分使用代码ETIMEDOUT即时(不是在1分钟内)返回。

有没有一种简单的方法来实现上面的逻辑?

即使以下代码立即返回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函数

由于

3 个答案:

答案 0 :(得分:1)

我用其他规则的条件变量实现了我的逻辑(使用包装互斥,bool标志等) 谢谢大家的意见。

答案 1 :(得分: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();

答案 2 :(得分:0)

对于第二段代码:AFAIK pthread_mutex_timedlock仅与CLOCK_REALTIME一起使用。

  • CLOCK_REALTIME是自1970年1月1日以来的秒数
  • 通常在开机后进入CLOCK_MONOTONIC

在这些前提下,超时设置是从1970年开始的几秒钟,因此是过去的时间。