我尝试使用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
功能
谢谢
我用条件变量实现了我的逻辑,关于其他规则(使用包装互斥锁、布尔标志等)谢谢大家的评论。
对于第二段代码:AFAIK pthread_mutex_timedlock仅适用于CLOCK_REALTIME。
- 自 1970 年 1 月 1 日以来的秒数CLOCK_REALTIME
- CLOCK_MONOTONIC通常在启动后
在这些前提下,超时设置是进入 1970 年的几秒钟,因此是过去的。
尝试这样的事情:
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();