diff --git a/src/backend/storage/ipc/shm_mq.c b/src/backend/storage/ipc/shm_mq.c
index 40df8e1251e..0960e5a18f3 100644
--- a/src/backend/storage/ipc/shm_mq.c
+++ b/src/backend/storage/ipc/shm_mq.c
@@ -826,6 +826,8 @@ shm_mq_detach_internal(shm_mq *mq)
 {
 	PGPROC	   *victim;
 
+	pg_write_barrier();
+
 	SpinLockAcquire(&mq->mq_mutex);
 	if (mq->mq_sender == MyProc)
 		victim = mq->mq_receiver;
@@ -1058,7 +1060,15 @@ shm_mq_receive_bytes(shm_mq_handle *mqh, Size bytes_needed, bool nowait,
 		 * detached.
 		 */
 		if (mq->mq_detached)
+		{
+			pg_read_barrier();
+			if (written != pg_atomic_read_u64(&mq->mq_bytes_written))
+			{
+				elog(LOG, "XXX");
+				continue;
+			}
 			return SHM_MQ_DETACHED;
+		}
 
 		/*
 		 * We didn't get enough data to satisfy the request, so mark any data
