sem_timedwait () не работает на удаленной машине - PullRequest
0 голосов
/ 25 мая 2019

Я написал C ++ программу для синхронизации потоков. Программа работает на моем компьютере, для которой установлена ​​операционная система Ubuntu 16.04. При запуске программы на удаленной машине с Ubuntu 18.04 возникает другое поведение. Я просто использую sem_timedwait() функцию Linux ( man page ), чтобы вызвать тайм-аут, если некоторые сигналы не приходят вовремя. Здесь tfoundry () вызывается posix-потоками, и он должен ждать сигналов sem1 и sem2, чтобы продолжить его выполнение. Через 5 секунд, даже если один из сигналов не получен, поток должен прекратить работу.

struct Foundry{
    sem_t sem1;
    sem_t sem2;
    const struct timespec* abs_timeout;
    struct timeval currentTime;
    struct timespec ts;
};


void* tfoundry(void* f){
    Foundry* foundry = (Foundry*) f;
    sem_init(&(foundry->sem1), 0, 0);
    sem_init(&(foundry->sem2), 0, 0);
    foundry->abs_timeout = &(foundry->ts);
    gettimeofday(&(foundry->currentTime),NULL);
    // 5 sec for timeout
    foundry->ts.tv_sec = foundry->currentTime.tv_sec + 5; 
    if (sem_timedwait(&(foundry->sem1),foundry->abs_timeout) != 0) 
        exit(-1);

    if (sem_timedwait(&(foundry->sem2),foundry->abs_timeout) != 0) 
        exit(-1);
}

В моем компьютере этот поток ожидает 5 секунд, и если не поступило два сигнала, он просто завершается. Но на удаленной машине он неожиданно выходит без ожидания 5 секунд. Я буду признателен за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...