diff --git a/pcbnew/tracks_cleaner.cpp b/pcbnew/tracks_cleaner.cpp
index c0ae4a7596..e4baf71acc 100644
--- a/pcbnew/tracks_cleaner.cpp
+++ b/pcbnew/tracks_cleaner.cpp
@@ -612,6 +612,7 @@ void TRACKS_CLEANER::cleanup( bool aDeleteDuplicateVias, bool aDeleteNullSegment
             while( !m_brd->BuildConnectivity() )
                 wxSafeYield();
 
+            std::lock_guard lock( m_mutex );
             m_connectedItemsCache.clear();
         } while( mergeSegments( m_brd->GetConnectivity()->GetConnectivityAlgo() ) );
     }
@@ -631,10 +632,13 @@ const std::vector<BOARD_CONNECTED_ITEM*>& TRACKS_CLEANER::getConnectedItems( PCB
 
     const std::shared_ptr<CONNECTIVITY_DATA>& connectivity = m_brd->GetConnectivity();
 
-    if( m_connectedItemsCache.count( aTrack ) == 0 )
+    if( !m_connectedItemsCache.contains( aTrack ) )
+    {
+        std::lock_guard lock( m_mutex );
         m_connectedItemsCache[ aTrack ] = connectivity->GetConnectedItems( aTrack, connectedTypes );
+    }
 
-    return m_connectedItemsCache[ aTrack ];
+    return m_connectedItemsCache.at( aTrack );
 }
 
 
diff --git a/pcbnew/tracks_cleaner.h b/pcbnew/tracks_cleaner.h
index dcbe14e414..73096a3b47 100644
--- a/pcbnew/tracks_cleaner.h
+++ b/pcbnew/tracks_cleaner.h
@@ -24,6 +24,7 @@
 #ifndef KICAD_TRACKS_CLEANER_H
 #define KICAD_TRACKS_CLEANER_H
 
+#include <mutex>
 #include <pcb_track.h>
 #include <board.h>
 
@@ -127,6 +128,7 @@ private:
     std::map<PCB_TRACK*, std::vector<BOARD_CONNECTED_ITEM*>> m_connectedItemsCache;
 
     std::function<bool( BOARD_CONNECTED_ITEM* aItem )>       m_filter;
+    std::mutex m_mutex;
 };