C 多執行緒基礎知識彙總

2022-09-26 02:15:07 字數 3118 閱讀 7200

最近自己寫了個小爬蟲,裡面用到了多執行緒技術,忽然發現對此技術竟然有些陌生了,於是乎開始瘋狂的去問度娘,在此記錄下來,以便自己和各位小夥伴們學習。

一、什麼是執行緒

乙個應用程式就相當於乙個程序,程序擁有應用程式的所有資源程序包括執行緒,程序的資源被執行緒共享,但不擁有執行緒。我們可以開啟電腦中的任務管理器,執行的.exe都是乙個程序,裡面的分支是執行緒。

二、多執行緒

多執行緒其實就是程序中一段並行執行的**

1. 建立並啟動執行緒

static void main()

///

/// 測試方法

///

private static void test1()

}結果:2、暫定執行緒諾幹時間

static void main()

_main()");

console.read();

}///

/// 測試方法

///

private static void test1()

_test()");

for (int i = 0; i < 10; i++)

_");}}

結果:3、執行緒合併

thread.join操作會阻塞當前執行緒,等待子執行緒完成後再進行執行。

static void main()

_main()1");

thread.join();

console.writeline($"主線程id_main()2");

console.read();

}///

/// 測試方法

///

private static void test1()

_test()");

for (int i = 0; i < 10; i++)

_");}}

結果:4、執行緒終止

static void main()

_main()1");

thread.sleep(3000);

thread.abort();

console.writeline($"主線程id_main()2");

console.read();

}///

/// 測試方法

///

private static void test1()

_test()");

for (int i = 0; i < 10; i++)

_");}}

結果:5、執行緒中的引數傳遞

static void main()

_main()");

//第一種引數傳遞方式

var thread1 = new thread(() => test1("小魔王"));

thread1.start();

//第二種引數傳遞方式(引數只能是乙個,object型別)

var parameterizedthreadstart = new parameterizedthreadstart(test2);

var thread2 = new thread(parameterizedthreadstart);

thread2.start("大魔王");

console.read();

}///

/// 測試方法

///

private static void test1(string name)

_我的名字叫:");

}www.cppcns.com ///

/// 測試方法

///

private static void test2(object name)

_我的名字叫:");

}結果:

還有其他的傳遞方式,在此先不做說明了,這裡只介紹thread提供的這麼幾種。

6、執行緒安全和執行緒鎖lock

執行緒安全就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。執行緒安全情況下,不會出現資料不一致或者資料汙染的問題。 執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料! 若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則的話就可能影響執行緒安全。

lock 關鍵字通過獲取指定物件的互斥鎖,將語句塊標記為臨界區,執行語句然後釋放該鎖。

lock 確保當乙個執行緒位於**的臨界區時,另乙個執行緒不進入臨界區。如果其他執行緒試圖進入鎖定的**,則它將一直等待(即被阻止),直到該物件被釋放。使用lock,會導致整個應用程式序列化,降低程式的併發能力,影響效能。

到底什麼場景下要使用lock保證執行緒安全:該序列就序列,該並行就並行。

加鎖前:

public static int i = 1000000;

static void main()

console.read();

}///

/// 測試方法

///

private static void test1()

_i初始值:");

int count = 0;

for (int j = 0; j < 1000000; j++)

console.writeline($"輔線程id_執行次數:");

console.writeline($"輔線程id_i結束值:");

}結果:

加鎖後:

public static int i = 1000000;

private readonly static object objlock = new object();

static void main()

console.read();

}private static void test1()

_i初始值:");

for (int j = 0; j < 1000000; j++)

}console.writeline($"輔線程id_執行次數:");

console.writeline($"輔線程id_i結束值:");

}結果:

好啦,今天關於執行緒的知識就分箱到這裡啦。

c 基礎知識 多執行緒

執行緒被定義為程式的執行路徑。每個執行緒都定義了乙個獨特的控制流。如果您的應用程式涉及到複雜的和耗時的操作,那麼設定不同的執行緒執行路徑往往是有益的,每個執行緒執行特定的工作。執行緒是輕量級程序。乙個使用執行緒的常見例項是現代作業系統中並行程式設計的實現。使用執行緒節省了 cpu 週期的浪費,同時提...

多執行緒基礎知識

建立乙個序列佇列,該佇列中從方的都是要依次執行的任務,dispatch queue serial 表示序列佇列的標示 dispatch queue t serialqueue dispatch queue create serial dispatch queue serial 建立乙個並行佇列,並行...

多執行緒 基礎知識

1 建立執行緒 extends thread implements runnable 啟動執行緒 threadl類的start 執行緒完成 1 run 方法執行完成 2 丟擲乙個未處理的異常導致執行緒的提前結束 2 執行緒的狀態 新建立 執行緒被建立,但是沒有呼叫start方法 可執行 runnab...