2012-04-28 23 views
6
globalnum = 0 
n = 1 

class T(threading.Thread): 
    def run(self): 
    global globalnum 
    globalnum += n 

for _ in xrange(0, 999): 
    t = T() 
    t.start() 

print globalnum 

kết quả là 999 Trong thử nghiệm của tôi, tôi có vẻ như + = thread safe Câu hỏi của tôi là: là + = thực sự là an toàn không?là + = trong chuỗi python có an toàn không?

+0

Bạn có tin rằng bất kỳ hai của chủ đề của bạn thực sự đang chạy cùng một lúc? – stark

+0

Việc cố gắng xác định chủ đề an toàn bằng phương tiện kiểm tra là dấu hiệu của sự thiếu hiểu biết hoặc điên rồ. Điểm mấu chốt về mọi thứ _not_ là an toàn chỉ là bạn không thể dựa vào một hành vi cụ thể chỉ vì bạn đã thấy nó vài triệu lần mà không có độ lệch. –

Trả lời

10

+= không phải là chủ đề an toàn (source).

18

Không, nó không phải là thread-safe như các hoạt động x += 1 mất 4 opcodes như hình dưới đây:

4   0 LOAD_GLOBAL    0 (x) 
       3 LOAD_CONST    1 (1) 
       6 INPLACE_ADD   
       7 STORE_GLOBAL    0 (x) 

chọn ra:

>>> import dis 
>>> def test(): 
...  global x 
...  x += 1 
...  
... 
>>> dis.disassemble(test.func_code) 
    4   0 LOAD_GLOBAL    0 (x) 
       3 LOAD_CONST    1 (1) 
       6 INPLACE_ADD   
       7 STORE_GLOBAL    0 (x) 
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE   
+3

+1 để hiển thị cách tháo rời! Bí quyết đẹp! :) – johndodo

Các vấn đề liên quan