多線程編程,有時希望每個線程的數據相互隔離互不影響,有時卻希望線程間能共享數據,并保持同步。本篇體驗多線程共享和不共享數據。
□ 多線程不共享數據
對于多線程,CLR到底是怎樣為它們分配內存棧空間呢?是"一個蘿卜一個坑",每個線程都有自己的棧空間;還是"大樹底下好乘涼",所有的線程共享同一個棧空間?
我們讓2個線程執行相同的靜態方法,用到相同的變量,通過打印變量來求證多線程棧空間的分配情況。
class PRogram{static void Main(string[] args){new Thread(SayHi).Start();SayHi();}static void SayHi(){for (int i = 0; i < 5; i++){Console.WriteLine("我是線程#" + Thread.CurrentThread.ManagedThreadId + "這是我的第" +i+ "次說hello");}}}
雖然2個線程交叉執行,但都說了4次的hello。說明CLR為2個線程都分配了棧空間,變量i在各自的棧空間中相互不受影響。
□ 多線程共享數據
線程間是需要相互合作的,多個線程如何共享數據呢?
※ 共享實例變量
讓2個線程執行同一個實例方法,看看是否可以共享對象實例的公共字段。
using System;using System.Threading;namespace Consoleapplication1{class Program{public int whatever;static void Main(string[] args){Program p = new Program();new Thread(p.PrintVariable).Start();p.PrintVariable();}void PrintVariable(){whatever++;
新聞熱點
疑難解答