File size: 2,452 Bytes
25f35ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import streamlit as st
from time import sleep
import threading

# Thread-safe hash table class
class ThreadSafeHashTable:
    def __init__(self, size=10):
        self.size = size
        self.table = [[] for _ in range(size)]
        self.locks = [threading.Lock() for _ in range(size)]
    
    def _hash(self, key):
        return hash(key) % self.size
    
    def put(self, key, value):
        index = self._hash(key)
        with self.locks[index]:  # Thread-safe lock
            for i, (k, v) in enumerate(self.table[index]):
                if k == key:
                    self.table[index][i] = (key, value)
                    return
            self.table[index].append((key, value))
    
    def get(self, key):
        index = self._hash(key)
        with self.locks[index]:
            for k, v in self.table[index]:
                if k == key:
                    return v
        return None

    def delete(self, key):
        index = self._hash(key)
        with self.locks[index]:
            for i, (k, _) in enumerate(self.table[index]):
                if k == key:
                    del self.table[index][i]
                    return True
        return False

# Initialize the hash table
hash_table = ThreadSafeHashTable(size=10)

# Streamlit app
st.title("Thread-Safe Hash Table Visualization")

# Sidebar for inputs
st.sidebar.header("Operations")
key = st.sidebar.text_input("Key")
value = st.sidebar.text_input("Value")
operation = st.sidebar.selectbox("Operation", ["Put", "Get", "Delete"])
threads = st.sidebar.slider("Number of Threads", 1, 10, 1)

# Main area
st.header("Hash Table State")
for i, bucket in enumerate(hash_table.table):
    st.write(f"Bucket {i}: {bucket}")

# Log area
log = st.empty()

# Perform operation
if st.sidebar.button("Execute"):
    def perform_operation():
        if operation == "Put":
            hash_table.put(key, value)
            log.write(f"Put key={key}, value={value}")
        elif operation == "Get":
            result = hash_table.get(key)
            log.write(f"Get key={key}, result={result}")
        elif operation == "Delete":
            result = hash_table.delete(key)
            log.write(f"Delete key={key}, success={result}")

    threads_list = []
    for _ in range(threads):
        t = threading.Thread(target=perform_operation)
        t.start()
        threads_list.append(t)

    for t in threads_list:
        t.join()

    st.experimental_rerun()