Просматривая код, он не выглядит потокобезопасным. Чтобы использовать его из нескольких потоков, код приложения, который обращается к нему, должен быть защищен семафорными замками.
Если вы хотите сделать поток класса SortedCollection безопасным, вы можете написать функцию декоратора.
Это будет выглядеть примерно так:
SortedCollection:
def __init__(self):
self.mysemaphore = threading.Semaphore()
def guard(func):
def guarded(*args, **kwds):
self.mysemaphore.acquire()
try:
return func(*args, **kwds)
finally:
self.mysemaphore.release()
return guarded
# edit the class, applying the decorator to its methods.
@guard
def unsafeFunc(self, a, b, c):
''' do work here'''
EDIT
Не допускайте ошибки, думая, что многопоточная структура данных сделает поток кода вашего приложения безопасным. Если вы выполняете несколько операций над SortedCollection, все эти операции должны быть защищены блокировкой.
Даже если SortedCollection является потокобезопасным, следующий код не будет:
slist.insert(1)
slist.insert(2)
Возможно, что другой поток может вставить элемент между этими двумя операторами. Вам нужно будет охранять код вашего приложения. Если вы добавите это в код своего приложения, вам не нужно будет изменять SortedCollection для обеспечения безопасности потоков.
semaphore2.acquire()
try:
slist.insert(1)
slist.insert(2)
finally:
semaphore2.release()