pthread_mutex не ожидает по таймауту

У меня есть следующий код:

bool Mutex::timed_lock(unsigned long milliseconds)
{
if (!milliseconds)
{
return lock();
}

struct timespec ts;
ts.tv_sec = milliseconds / 1000;
ts.tv_nsec = (milliseconds - (ts.tv_sec * 1000)) * 1000000;

//printf("%lld, %ld\n\n", ts.tv_sec, ts.tv_nsec);int res = pthread_mutex_timedlock(&info->mutex, &ts);
info->ref_count += res != ETIMEDOUT && res != EDEADLK && !res ? 1 : 0;
return res != ETIMEDOUT && res != EDEADLK && !res;
}

тогда я попытался проверить это так:

Mutex lock;

std::thread([&]{
std::cout<<"LOCKED: "<<std::boolalpha<<lock.lock()<<"\n";
Sleep(5000);
}).detach();
Sleep(1000);

std::cout<<"DONE: "<<std::boolalpha<<lock.timed_lock(6600)<<"\n";

В результате он печатает «LOCKED: true \ n DONE: false» и ETIMEDOUT это ошибка. Он должен блокироваться на время 6600 мс, если не может его заблокировать.

Есть идеи, что я делаю не так? Я только изобретаю колесо вместо использования C ++ 11 std::mutex потому что этот Mutex мне нужно поделиться для синхронизации / событий IPC (аналогично WinAPI CreateEvent).

0

Решение

Тайм-аут pthread_mutex_timedlock() это абсолютное время ожидания, а не относительное время ожидания. Таким образом, вам нужно вычислить текущее время и рассчитать будущее абсолютное время:

struct timespec ts;
struct timespec now;
gettimeofday(&now, NULL);
ts->tv_sec = now.tv_sec + milliseconds/1000;
ts->tv_nsec = (now.tv_usec * 1000) + ((milliseconds%1000) * 1000000);
if (ts.tv_nsec >= 1000000000) {
ts.tv_sec++;
ts.tv_nsec -= 1000000000;
}
3

Другие решения


По вопросам рекламы [email protected]