diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 6f35db4..0d71173 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -3639,6 +3639,28 @@ threadRun(void *arg)
 				maxsock = sock;
 		}
 
+		/* also meet the next progress report time if needed */
+		if (progress && min_usec > 0
+#if !defined(PTHREAD_FORK_EMULATION)
+			&& thread->tid == 0
+#endif /* !PTHREAD_FORK_EMULATION */
+			)
+		{
+			/* get current time if needed */
+			if (now_usec == 0)
+			{
+				instr_time	now;
+
+				INSTR_TIME_SET_CURRENT(now);
+				now_usec = INSTR_TIME_GET_MICROSEC(now);
+			}
+
+			if (now_usec >= next_report)
+				min_usec = 0;
+			else if ((next_report - now_usec) < min_usec)
+				min_usec = next_report - now_usec;
+		}
+
 		if (min_usec > 0 && maxsock != -1)
 		{
 			int			nsocks; /* return from select(2) */
@@ -3744,7 +3766,13 @@ threadRun(void *arg)
 				last_lags = lags;
 				last_report = now;
 				last_skipped = thread->throttle_latency_skipped;
-				next_report += (int64) progress *1000000;
+
+				/* Ensure that the next report is in the future, in case
+				 * pgbench/postgres got stuck somewhere...
+				 */
+				do {
+					next_report += (int64) progress * 1000000;
+				} while (now >= next_report);
 			}
 		}
 #else
@@ -3808,7 +3836,13 @@ threadRun(void *arg)
 				last_lags = lags;
 				last_report = now;
 				last_skipped = thread->throttle_latency_skipped;
-				next_report += (int64) progress *1000000;
+
+				/* Ensure that the next report is in the future, in case
+				 * pgbench/postgres got stuck somewhere...
+				 */
+				do {
+					next_report += (int64) progress * 1000000;
+				} while (now >= next_report);
 			}
 		}
 #endif   /* PTHREAD_FORK_EMULATION */
