diff --git a/prak3/src/server.cpp b/prak3/src/server.cpp
index 64de8a42b18f7afea26718e199d4762a6a711840..fe652c5d237a043b833329c8c488d0bc6ca9c95e 100644
--- a/prak3/src/server.cpp
+++ b/prak3/src/server.cpp
@@ -7,6 +7,7 @@
 #include <mutex>
 #include <map>
 #include <atomic>
+#include <shared_mutex>
 
 #define PORT 2525
 #define BUFFER_SIZE 1024
@@ -15,6 +16,7 @@
 #define DELETE_OPERATION 'd'
 
 std::mutex mtx;
+std::shared_mutex shared_mtx;
 std::map<std::string, std::string> DB;
 std::atomic<int> request_count(0);
 
@@ -111,9 +113,9 @@ std::string processRequest_slow(const std::string& request) {
     free(parsedRequest);
     return response;
 }
-//=============================================
 
 // we assume that this function is fast
+// gelichzeitig lesen oder schreiben ist erlaubt
 std::string processRequest_fast(const std::string& request) {
     std::string response;
 
@@ -164,6 +166,64 @@ std::string processRequest_fast(const std::string& request) {
 
     return response;
 }
+//=============================================
+
+
+// mehrer Thread Lesen gleichzeitig aber ein Thread schreibt.
+std::string processRequest_shared_mtx(const std::string& request) {
+    std::string response;
+
+    size_t first = request.find(",");
+    size_t second = request.find(",", first + 1);
+    size_t end = request.find(";");
+
+    if (first == std::string::npos || end == std::string::npos) {
+        return "Bad request!";
+    }
+
+    char operation = request[0];
+    std::string key;
+    std::string value;
+
+    if (second != std::string::npos) {
+        key = request.substr(first + 1, second - first - 1);
+        value = request.substr(second + 1, end - second - 1);
+    } else {
+        key = request.substr(first + 1, end - first - 1);
+    }
+
+    switch (operation) {
+        case STORE_OPERATION: {
+            std::unique_lock<std::shared_mutex> lock(shared_mtx);
+            DB[key] = value;
+            response = "Stored [" + key + "] = " + value;
+            break;
+        }
+        case GET_OPERATION: {
+            std::shared_lock<std::shared_mutex> lock(shared_mtx);
+            if (DB.find(key) != DB.end()) {
+                response = "Value of [" + key + "] is " + DB[key];
+            } else {
+                response = "Key [" + key + "] not found";
+            }
+            break;
+        }
+        case DELETE_OPERATION: {
+            std::unique_lock<std::shared_mutex> lock(shared_mtx);
+            if (DB.erase(key)) {
+                response = "Deleted key [" + key + "]";
+            } else {
+                response = "Key [" + key + "] not found for deletion";
+            }
+            break;
+        }
+        default:
+            response = "Invalid operation!";
+            break;
+    }
+
+    return response;
+}
 
 void handle_client(int client_socket) {
     char buffer[BUFFER_SIZE] = {0};
@@ -175,7 +235,7 @@ void handle_client(int client_socket) {
         }
 
         buffer[bytes_received] = '\0';
-        std::string response = processRequest_slow(buffer);
+        std::string response = processRequest_shared_mtx(buffer);
         
         // Anfragezähler inkrementieren
         request_count.fetch_add(1, std::memory_order_relaxed);
@@ -217,7 +277,8 @@ int main() {
     std::thread monitor_thread(throughput_monitor);
     monitor_thread.detach();
 
-    while (true) {
+    while (true) 
+    {
         client_socket = accept(server_fd, (struct sockaddr*)&address, &addrlen);
         
         if (client_socket < 0) {