Index: uspace/lib/cpp/include/internal/thread.hpp
===================================================================
--- uspace/lib/cpp/include/internal/thread.hpp	(revision 771d162e567c89ce41852e11d8a0b9031a168246)
+++ uspace/lib/cpp/include/internal/thread.hpp	(revision da6bcc0fb6dfddd5ecd61b224a7b568bf875dbfb)
@@ -54,8 +54,9 @@
     struct threading_policy<fibril_tag>
     {
-        using mutex_type   = fibril_mutex_t;
-        using thread_type  = fid_t;
-        using condvar_type = fibril_condvar_t;
-        using time_unit    = suseconds_t;
+        using mutex_type        = fibril_mutex_t;
+        using thread_type       = fid_t;
+        using condvar_type      = fibril_condvar_t;
+        using time_unit         = suseconds_t;
+        using shared_mutex_type = fibril_rwlock_t;
 
         struct thread
@@ -159,4 +160,57 @@
             }
         };
+
+        struct shared_mutex
+        {
+            static void init(shared_mutex_type& mtx)
+            {
+                fibril_rwlock_initialize(&mtx);
+            }
+
+            static void lock(shared_mutex_type& mtx)
+            {
+                fibril_rwlock_write_lock(&mtx);
+            }
+
+            static void unlock(shared_mutex_type& mtx)
+            {
+                fibril_rwlock_write_unlock(&mtx);
+            }
+
+            static void lock_shared(shared_mutex_type& mtx)
+            {
+                fibril_rwlock_read_lock(&mtx);
+            }
+
+            static void unlock_shared(shared_mutex_type& mtx)
+            {
+                fibril_rwlock_read_unlock(&mtx);
+            }
+
+            static bool try_lock(shared_mutex_type& mtx)
+            {
+                // TODO: rwlocks don't have try locking capabilities
+                lock(mtx);
+
+                return true;
+            }
+
+            static bool try_lock_shared(shared_mutex_type& mtx)
+            {
+                lock(mtx);
+
+                return true;
+            }
+
+            static bool try_lock_for(shared_mutex_type& mtx, time_unit timeout)
+            {
+                return try_lock(mtx);
+            }
+
+            static bool try_lock_shared_for(shared_mutex_type& mtx, time_unit timeout)
+            {
+                return try_lock(mtx);
+            }
+        };
     };
 
@@ -170,8 +224,9 @@
     using threading = threading_policy<default_tag>;
 
-    using thread_t    = typename threading::thread_type;
-    using mutex_t     = typename threading::mutex_type;
-    using condvar_t   = typename threading::condvar_type;
-    using time_unit_t = typename threading::time_unit;
+    using thread_t       = typename threading::thread_type;
+    using mutex_t        = typename threading::mutex_type;
+    using condvar_t      = typename threading::condvar_type;
+    using time_unit_t    = typename threading::time_unit;
+    using shared_mutex_t = typename threading::shared_mutex_type;
 }
 
