定義
行程
行程(Process)是Windows系統中的一個基本概念,它包含著一個運行程式所需要的資源,一個正在運行的應用程式在作業系統中被視為一個行程,行程可以包括一個或多個執行緒,
程式是在特定作業系統上的可執行檔案,它是一個靜態的概念,
而行程可以被認為是程式的一個動態的概念,它有自己的地址空間,能執行一些操作,程式的執行都會伴隨著行程的生成,一個程式的執行會產生一個或多個行程,
執行緒
執行緒是行程的一個物體,是獨立運行和獨立調度的基本單位(CPU上真正運行的是執行緒),執行緒自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程式計數器,一組暫存器和堆疊),但它可與同屬一個行程的其他的執行緒共享行程所擁有的全部資源,
在.NET中,一般以Main()方法作為入口的,當呼叫此方法時系統就會自動創建一個主執行緒,
執行緒主要是由CPU暫存器、呼叫堆疊和執行緒本地存盤器(Thread Local Storage,TLS)組成的,
CPU暫存器是CPU內部用來存放資料的一些小型存盤區域,用來暫時存放參與運算的資料和運算結果,其實暫存器就是一種常用的時序邏輯電路,但這種時序邏輯電路只包含存盤電路,在執行緒中主要記錄當前所執行執行緒的狀態,
呼叫堆疊是用來存盤有關正在運行的子程式的回傳地址的堆疊,在此主要用于維護執行緒所呼叫到的記憶體與資料,通過訪問呼叫堆疊,可以查找到呼叫的子程式,
TLS分為靜態和動態兩種,就是基于堆疊的全域變數或者靜態變數來訪問資料,主要用于將將資料和執行的特定的執行緒聯系起來,
區別
- 行程擁有自己的資源空間,每啟動一個行程,系統就會為它分配地址空間;而執行緒與CPU資源分配無關,多個執行緒共享同一行程內的資源,使用相同的地址空間,一個行程可以包含若干個執行緒,同一行程的執行緒間可以共享全域變數、靜態變數等資料,而行程之間的通信需要以通信的方式(Inter Process Communication,IPC)進行,不過如何處理好同步與互斥是撰寫多執行緒程式的難點,
- 多行程程式更健壯,多執行緒程式只要有一個執行緒死掉,整個行程也死掉了,而一個行程死掉并不會對另外一個行程造成影響,因為行程有自己獨立的地址空間,
- 行程可以通過管道、套接字、信號互動、共享記憶體、訊息佇列等等進行通信;而執行緒本身就會共享記憶體,指標指向同一個內容,互動很容易,
多執行緒
創建多執行緒步驟:
1、撰寫執行緒所要執行的方法,
2、實體化Thread類,并傳入一個指向執行緒所要執行方法的委托(ThreadStart或ParameterizedThreadStart),
Thread thread=new Thread(new ThreadStart(method)),該委托中作為引數的方法不需要引數,并且沒有回傳值,也可以分開寫:
ThreadStart threadStart=new ThreadStart(Calculate);
Thread thread=new Thread(threadStart);
ParameterizedThreadStart可以委托一個方法,利用這個方法可以向執行緒傳遞引數,引數型別必須是Object的,
3、呼叫Thread實體的Start方法,thread.Start();
執行緒的屬性
下面程式里列了一些比較常用的屬性,
using System;
using System.Threading;
namespace 多執行緒
{
class Program
{
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Thread1));
//thread1.IsBackground = true;//標記為后臺執行緒
thread1.Start();
//獲取當前正在運行的執行緒
Thread thread=Thread.CurrentThread;
thread.Name = "當前執行緒";
//獲取當前執行緒的唯一識別符號
int id = thread1.ManagedThreadId;
//獲取當前執行緒的狀態
ThreadState state = thread1.ThreadState;
//獲取當前執行緒的優先級
ThreadPriority priority = thread1.Priority;
//掛起執行緒
//thread1.Suspend();
中止執行緒
//thread1.Abort();
string str = string.Format("Thread ID:{0}\n" + "Thread Name:{1}\n" + "Thread State:{2}\n" + "Thread Priority:{3}\n", id, thread.Name,state, priority);
Console.WriteLine(str);
Console.ReadKey();
}
static void Thread1()
{
Console.WriteLine("無參執行緒!");
}
}
}
同步
執行緒的同步是指在同一時間只有一個執行緒可以訪問變數,對于多執行緒程式來講,需要使用關鍵字Lock,可以把一段代碼定義為互斥段,互斥段在一個時刻內只允許一個執行緒進入執行,而其他執行緒必須等待.
Lock(expression)
{
statement_block
}
如果鎖住一個類的實體,可以使用this,在類內的方法里使用lock (this);
如果鎖住一個靜態變數,一般使用類名.
跨執行緒訪問
需要使用方法回呼完成跨執行緒.
namespace 多執行緒1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//定義回呼
private delegate void setTextValueCallBack();
//宣告回呼
private setTextValueCallBack a;
private void button1_Click(object sender, EventArgs e)
{
//實體化回呼
a = new setTextValueCallBack(SetValue);
//創建一個執行緒去執行這個方法
Thread thread = new Thread(new ThreadStart(Test));
//將執行緒設定為后臺執行緒
thread.IsBackground = true;
thread.Start();
}
private void Test()
{
//使用回呼,invoke方法可以激活控制元件所在執行緒,從而呼叫控制元件.invoke(回呼,引數(呼叫方法的引數)).invoke表是同步(會等回呼方法執行完后再執行下一步)、begininvoke表示異步(不等直接執行下一步)
textBox1.Invoke(a);
}
/// <summary>
/// 定義回呼使用的方法
/// </summary>
private void SetValue()
{
this.textBox1.Text = "1";
}
}
}
參考鏈接如下:
C#多執行緒
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263368.html
標籤:其他
上一篇:肝一個嵌入式日歷吧!LVGL『Calendar日歷控制元件』介紹
下一篇:一些惡心的代碼片段
