Я написал 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 секунд. Я буду признателен за любую помощь.