我已经编写了一个用于线程同步的C ++程序。该程序适用于我的计算机,其操作系统为Ubuntu 16.04。在使用Ubuntu 18.04的远程计算机上运行程序时,会出现不同的行为。如果某些信号未按时到达,我只是使用Linux(man page)的sem_timedwait()
函数导致超时。在这里,posix线程调用tfoundry(),它将等待信号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秒钟。我将不胜感激。