Improve filesystem backend thread safety
diff --git a/requests_cache/backends/filesystem.py b/requests_cache/backends/filesystem.py
index c94b662..c018c5a 100644
--- a/requests_cache/backends/filesystem.py
+++ b/requests_cache/backends/filesystem.py
@@ -40,6 +40,7 @@
 from pathlib import Path
 from pickle import PickleError
 from shutil import rmtree
+from threading import RLock
 from typing import Iterator
 
 from ..serializers import SERIALIZERS
@@ -97,14 +98,16 @@
         self.cache_dir = get_cache_path(cache_name, use_cache_dir=use_cache_dir, use_temp=use_temp)
         self.extension = _get_extension(extension, self.serializer)
         self.is_binary = getattr(self.serializer, 'is_binary', False)
+        self._lock = RLock()
         makedirs(self.cache_dir, exist_ok=True)
 
     @contextmanager
     def _try_io(self, ignore_errors: bool = False):
         """Attempt an I/O operation, and either ignore errors or re-raise them as KeyErrors"""
         try:
-            yield
-        except (IOError, OSError, PickleError) as e:
+            with self._lock:
+                yield
+        except (EOFError, IOError, OSError, PickleError) as e:
             if not ignore_errors:
                 raise KeyError(e)
 
@@ -142,7 +145,8 @@
 
     def paths(self) -> Iterator[Path]:
         """Get absolute file paths to all cached responses"""
-        return self.cache_dir.glob(f'*{self.extension}')
+        with self._lock:
+            return self.cache_dir.glob(f'*{self.extension}')
 
 
 def _get_extension(extension: str = None, serializer=None) -> str: