Skip to content

Commit 10afc8a

Browse files
authored
Thread Kilit (Lock) Mekanizması
1 parent 16962a8 commit 10afc8a

File tree

1 file changed

+167
-0
lines changed

1 file changed

+167
-0
lines changed

thread_lock_mekanizması.py

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
import threading
2+
import time
3+
4+
x = 0
5+
count = 100000
6+
# işlemi bu sayıda tekrarlayacağız. Sadece 1 kerede istediğimiz sonucu almayabiliriz.
7+
# tek bir sefer çalıştırıldığında işlem çok kısa süreceği için biri başlamadan diğeri
8+
# bitmiş olacak ve aynı anda x değerine erilmesi zor olacaktır. Oysa uzun süren
9+
# bir işlem için aynı anda erişilmesi
10+
11+
"""
12+
Aşağıda x değerine ekleme ve çıkarma yapan fonksiyonlar tanımlayacağız.
13+
Sırasıyla +3, +1, -1, -4 şeklinde ekleme ve çıkarmalar yapılacak.
14+
Ama x global değerine erişen fonksiyonlar aynı anda çalışacak ve aldıkları
15+
x değerine göre işlem yapacaklar. Bu da bir karışıklığa sebep olacak.
16+
Çünkü x değeri 4 thread'in aynı aynda çalışmasında dolayı sürekli değişmiş olacak!
17+
İlk önce fonksiyonları ard arda çalıştırıp başlangıçtaki değeri elde ettiğimizi
18+
göreceğiz. Fakat thread kullanıldığında x başlangıçtaki değere eşit olmayacak.
19+
Yüz bin kere tekrarlamamıza rağmen thread sonucu da 0 gelebilir. Fakat program
20+
birkaç kez çalıştırılırsa hatalı sonuçlar da görülecektir.
21+
22+
Bu sorunu çözmenin yolu bir değişkene aynı anda sadece bir thread'in
23+
erişip, yine sadece onun işlem yapmasına müsade eden thread lock mekanizmasını
24+
kullanmaktır. Aşağıda thread lock mekanizmasının kullanımı ve sonucu görülebilir.
25+
"""
26+
27+
def add_3():
28+
global x
29+
for i in range(count):
30+
x += 3
31+
print("3 eklendi.")
32+
33+
def add_2():
34+
global x
35+
for i in range(count):
36+
x += 2
37+
print("2 eklendi.")
38+
39+
def subtract_1():
40+
global x
41+
for i in range(count):
42+
x -= 1
43+
print("1 çıkarıldı.")
44+
45+
def subtract_4():
46+
global x
47+
for i in range(count):
48+
x -= 4
49+
print("4 çıkarıldı.")
50+
51+
# sıralı çalıştırma ve sonucu
52+
add_3()
53+
add_2()
54+
subtract_1()
55+
subtract_4()
56+
print("\nSıralı çalışmadan sonra x: {}\n".format(x))
57+
58+
#thread çalıştırılması ve sonucu
59+
adding_2 = threading.Thread(target=add_2)
60+
adding_3 = threading.Thread(target=add_3)
61+
subtracting_4 = threading.Thread(target=subtract_4)
62+
subtracting_1 = threading.Thread(target=subtract_1)
63+
64+
adding_2.start()
65+
adding_3.start()
66+
subtracting_1.start()
67+
subtracting_4.start()
68+
69+
time.sleep(2) # yukarıdaki thread'ler bitmeden yazılmasın diye bekledik.
70+
71+
print("Thread çalışmasından sonra x: {}\n\n".format(x))
72+
73+
74+
75+
# LOCK MEKANİZMASININ KULLANILMASI
76+
x = 0
77+
count = 100000
78+
lock = threading.Lock()
79+
80+
# dosya işlemlerinde sıklıkla kullanılan with terimi burada da kullanılabilir.
81+
# with open ile açılan dosya işlem bitince nasıl otomatik kapatılıyorsa
82+
# with lock ile yapılan işlem bittikten sonra da lock kaldırılır.
83+
# aşağıdaki thread'lerin çalışmasından sonra x daima 0 olacak.
84+
# çünkü bir thread işlem yapılırken başka bir thread o değere erişip işlem yapamaz.
85+
def add_3():
86+
global x
87+
with lock:
88+
for i in range(count):
89+
x += 3
90+
print("3 eklendi.")
91+
92+
def add_2():
93+
global x
94+
with lock:
95+
for i in range(count):
96+
x += 2
97+
print("2 eklendi.")
98+
99+
def subtract_1():
100+
global x
101+
with lock:
102+
for i in range(count):
103+
x -= 1
104+
print("1 çıkarıldı.")
105+
106+
def subtract_4():
107+
global x
108+
with lock:
109+
for i in range(count):
110+
x -= 4
111+
print("4 çıkarıldı.")
112+
113+
#lock tanımlı fonksiyonlarda thread çalıştırılması ve sonucu
114+
adding_2 = threading.Thread(target=add_2)
115+
adding_3 = threading.Thread(target=add_3)
116+
subtracting_4 = threading.Thread(target=subtract_4)
117+
subtracting_1 = threading.Thread(target=subtract_1)
118+
119+
adding_2.start()
120+
adding_3.start()
121+
subtracting_1.start()
122+
subtracting_4.start()
123+
124+
time.sleep(2) # yukarıdaki thread'ler bitmeden yazılmasın diye bekledik.
125+
126+
print("\nLock tanıladığımız fonksiyonlarda thread çalışmasından sonra x: {}\n\n".format(x))
127+
128+
129+
130+
131+
132+
133+
134+
135+
136+
137+
138+
139+
140+
141+
142+
143+
144+
145+
146+
147+
148+
149+
150+
151+
152+
153+
154+
155+
156+
157+
158+
159+
160+
161+
162+
163+
164+
165+
166+
167+

0 commit comments

Comments
 (0)