1. 程式人生 > >多執行緒-共享全域性變數問題

多執行緒-共享全域性變數問題

1. 多執行緒同時對全域性變數進行操作

import threading

#定義全域性變數
g_num = 0

#迴圈一次給全域性變數加1
def sum_num1():
for i in range(1000000):
global g_num
g_num += 1

print("sum1:", g_num)

#迴圈一次給全域性變數加1
def sum_num2():
for i in range(1000000):
global g_num
g_num += 1
print(“sum2:”, g_num)

if __ name__ == ‘__ main__’:
# 建立兩個執行緒
first_thread = threading.Thread(target=sum_num1)
second_thread = threading.Thread(target=sum_num2)

# 啟動執行緒
first_thread.start()
# 啟動執行緒
second_thread.start()

執行結果:

	sum1: 1210949
	sum2: 1496035

由此可見多執行緒同時對全域性變數操作資料發生了錯誤

可能出現錯誤的原因分析及個人理解:
兩個執行緒first_thread和second_thread都要對全域性變數g_num(預設是0)進行加1運算,但是由於是多執行緒同時操作,有可能出現下面情況:

  1. 在g_num=0時,first_thread取得g_num=0。此時系統把first_thread排程為”sleeping”狀態,把second_thread轉換為”running”狀態,t2也獲得g_num=0
  2. 然後second_thread對得到的值進行加1並賦給g_num,使得g_num=1
  3. 然後系統又把second_thread排程為”sleeping”,把first_thread轉為”running”。執行緒t1又把它之前得到的0加1後賦值給g_num。
  4. 這樣導致雖然first_thread和first_thread都對g_num加1,但結果仍然是g_num=1

解決方法下次分享。

bye~

相關推薦

執行-共享全域性變數

from threading import Thread import time g_num = 100 def work1(): global g_num for i in range(3): g_num += 1 print("----in wo

python執行-共享全域性變數

目錄 多執行緒-共享全域性變數 多執行緒-共享全域性變數 列表當作實參傳遞到執行緒中 總結 多執行緒-共享全域性變數問題 多執行緒開發可能遇到的問題 測試1 測試2 多執行緒-共享全域性變數 多執行緒-共享全域性變

執行---共享全域性變數

多執行緒-共享全域性變數 from threading import Thread import time g_num = 100 def work1(): global g_num

執行-共享全域性變數問題

1. 多執行緒同時對全域性變數進行操作 import threading #定義全域性變數 g_num = 0 #迴圈一次給全域性變數加1 def sum_num1(): for i in range(1000000): global g_num g_num +

Python 執行,(全域性變數)資料共享,threading.Lock() 互斥鎖

  demo.py(互斥鎖): import threading import time # 定義一個全域性變數 g_num = 0 def test1(num): global g_num # 全域性變數可以實現執行緒間資料共享。也可以通過傳參實現 fo

基於執行全域性變數

def current_nation default_nation = (current_contact && current_contact&.company&.country) ? current_contact&.company&.count

Linux--執行訪問全域性變數互斥的例子

以下案例是兩個執行緒同時訪問一個全域性worker變數,並分別對裡面的成員counter進行增長 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include &

執行執行共享區域性變數的方法

1. 操作相同時,寫一個 Runnable 實現類,內部設定成員變數,run 方法修改該變數,將該Runnable傳給不同Thread使用; 2. 操作不同時,在Thread呼叫類例項化一個數據實例,傳遞給不同Runnable處理,再把不同的Runnable傳給不同Thre

python-執行-共享變數問題

import threading sum = 0 loopSum = 1000000 lock = threading.Lock() def Add(): global sum, loopSum for i in range(1,loopSum): loc

JAVA執行——共享變數

【轉載】Java多執行緒程式設計:變數共享分析(Thread) 原部落格網址:https://www.cnblogs.com/xudong-bupt/archive/2013/05/22/3087864.html

Java執行操作區域性變數全域性變數

在這篇文章裡,我們首先闡述什麼是同步,不同步有什麼問題,然後討論可以採取哪些措施控制同步,接下來我們會仿照回顧網路通訊時那樣,構建一個伺服器端的“執行緒池”,JDK為我們提供了一個很大的concurrent工具包,最後我們會對裡面的內容進行探索。   為什麼要執

PYTHON——執行:條件變數(Condition)

  條件變數(Condition)也是一把鎖,除了同步鎖的作用外,還具有線上程間通訊的功能。   有一類執行緒需要滿足條件之後才能夠繼續執行,Python提供了threading.Condition 物件用於條件變數執行緒的支援,它除了能提供RLock()或Lock()的方法外,還提供了 wait()、no

執行共享資源

多執行緒共享資源 按照作業系統原理,程序是系統資源分配的最小單位,執行緒是cpu排程的最小單位。執行緒共享程序申請的資源,但是執行緒有維持自己正常執行的很小的資源,這很小的資源為各個執行緒獨有。 同一個程序中建立的多執行緒共享的環境包括: 程序程式碼段 程序的公有資

c/c++ 執行 利用條件變數實現執行安全的佇列

多執行緒 利用條件變數實現執行緒安全的佇列 背景:標準STL庫的佇列queue是執行緒不安全的。 利用條件變數(Condition variable)簡單實現一個執行緒安全的佇列。 程式碼: #include <queue> #include <memory> #include

執行之原子變數CAS演算法(二)

上篇博文,我們介紹了多執行緒之記憶體可見性Volatile(一),但是也遺留了一個問題,如何保證變數的”原子性操作(Atomic operations)”? Volatile保證部分型別的原子性 上篇博文,我們說Voloatile不能保證原子性,有一點侷

執行程式設計——條件變數

#include <pthread.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> /* 靜態方式初始化一個互斥鎖和一個條件變數 */ static pthread

兩種方式實現執行共享資源(典型的售票例子)

1、繼承Thread TestThread類 public class TestThread extends Thread{ private int ticket = 300; @Override public void run() { while(true){

執行 共享資源 同步鎖 java Java執行程式設計:Lock

Java多執行緒程式設計:Lock   synchronized是java中的一個關鍵字,也就是說是Java語言內建的特性。那麼為什麼會出現Lock呢?   如果一個程式碼塊被synchronized修飾了,當一個執行緒獲取了對應的鎖,並執行該程式碼塊時,其他執行緒便只

執行共享操作實列

專案需求      最近在做一個和支付相關的專案,由於上游通道對每個商戶交易額度有上限風控。因此我們需要實現一個商戶輪詢的機制,通過使用多個商戶號,來提高交易上限,滿足交易需求。需求分析      通過需求分析,我們知道商戶的交易額度是共享資源,因此涉及到了共享資源同步的問題

Java執行中static變數的使用 SimpleDateFormat時間格式化存線上程安全問題

兩篇文章 Java多執行緒中static變數的使用  (轉自:http://blog.csdn.net/yy304935305/article/details/52456771) &&  SimpleDateFormat時間格式化存線上程安全問題