我嘗試使用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
部分立即返回(不在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
功能
感謝
這裏的邏輯很奇怪,你的threadA鎖定了兩次互斥鎖。然而,最大的問題是你的threadA鎖定了互斥鎖,而threadB解鎖了它。你不能用pthread_mutex做到這一點,你必須在鎖定它的同一個線程中解鎖一個互斥鎖。 – nos
你可能想要更像'pthread_cond_timedwait'的東西,但不清楚你真的在做什麼,因爲如上所述。 – Duck
我真的很想實現像Windows事件。是的,鴨子,我用條件變量來完成它。一切正常 – andrii