C# 多線程并發編程基礎

1. 線程基礎

1.1 線程簡介

C# 中的線程是操作系統能夠進行運算調度的最小單位,它被包含在進程中,是進程中的實際運作單位。一個進程可以包含多個線程,這些線程可以并發執行不同的任務。

1.2 線程的創建與啟動

在 C# 中,可以使用?System.Threading.Thread?類來創建和管理線程。

創建線程:

Thread thread = new Thread(new ThreadStart(YourMethod));

啟動線程:

thread.Start();

1.3 線程的狀態

線程在其生命周期中會經歷多種狀態,包括新建、就緒、運行、阻塞和死亡等。

1.4 線程的優先級

C# 中的線程具有優先級,可以通過?Thread.Priority?屬性來設置。優先級高的線程更有可能獲得 CPU 時間片。

2. 多線程編程基礎

2.1 線程同步

多線程編程中,由于多個線程可能同時訪問共享資源,因此需要考慮同步問題。C# 提供了多種同步機制。

鎖(Lock):

object lockObject = new object();
lock (lockObject)
{// 臨界區代碼
}

互斥量(Mutex):

Mutex mutex = new Mutex();
mutex.WaitOne();
// 臨界區代碼
mutex.ReleaseMutex();

信號量(Semaphore):

Semaphore semaphore = new Semaphore(1, 1);
semaphore.WaitOne();
// 臨界區代碼
semaphore.Release();

2.2 線程間通信

線程間通信是多線程編程中的重要部分,C# 提供了多種機制來實現線程間的通信。

事件(Event):

ManualResetEvent event = new ManualResetEvent(false);
event.Set(); // 通知其他線程
event.WaitOne(); // 等待其他線程通知

等待句柄(WaitHandle):

AutoResetEvent waitHandle = new AutoResetEvent(false);
waitHandle.Set(); // 通知其他線程
waitHandle.WaitOne(); // 等待其他線程通知

2.3 線程池

線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在后臺以異步方式執行任務。

使用線程池:

ThreadPool.QueueUserWorkItem(new WaitCallback(YourMethod));

2.4 異步編程

C# 提供了異步編程模型(Async/Await),可以簡化異步操作的編寫。

異步方法:

public async Task<int> YourAsyncMethod()
{// 異步操作var result = await SomeAsyncOperation();return result;
}

3. 高級線程管理

3.1 并行類庫(TPL)

.NET Framework 4 引入了任務并行庫(Task Parallel Library, TPL),用于簡化并行編程。

創建任務:

Task task = new Task(YourMethod);
task.Start();

等待任務完成:

Task.WaitAll(task1, task2);

并行循環:

Parallel.For(0, 100, i => 
{// 并行執行的代碼
});

3.2 并行 LINQ(PLINQ)

PLINQ 是對 LINQ to Objects 的并行實現,可以顯著提高數據處理的性能。

PLINQ 查詢:

var query = from num in numbers.AsParallel()where num % 2 == 0select num;

3.3 同步上下文(SynchronizationContext)

同步上下文用于確保在正確的線程上執行回調。

獲取當前同步上下文:

SynchronizationContext context = SynchronizationContext.Current;

發布到同步上下文:

context.Post(state => 
{// 在正確的線程上執行的代碼
}, state);

4. 線程安全集合

4.1 線程安全集合類

C# 提供了一些線程安全的集合類,可以在多線程環境下安全地使用。

線程安全字典(ConcurrentDictionary):

ConcurrentDictionary<int, string> dict = new ConcurrentDictionary<int, string>();
dict.TryAdd(1, "Value1");
string value;
dict.TryGetValue(1, out value);

線程安全隊列(ConcurrentQueue):

ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
queue.Enqueue(1);
int item;
queue.TryDequeue(out item);

4.2 不可變集合

不可變集合是一旦創建就不能修改的集合,可以安全地在多線程間共享。

創建不可變集合:

ImmutableList<int> list = ImmutableList.Create(1, 2, 3);

5. 性能監控與調試

5.1 性能監控

使用性能監控工具可以幫助診斷多線程程序中的性能瓶頸。

性能計數器:

PerformanceCounter counter = new PerformanceCounter("Category", "Counter");
counter.NextValue();

5.2 調試技巧

調試多線程程序需要特殊的技巧和工具。

使用 Visual Studio 調試器:

  • 斷點
  • 并行堆棧窗口
  • 并行任務窗口

日志記錄:

using (var writer = new StreamWriter("log.txt", true))
{writer.WriteLine("Thread {0} is executing.", Thread.CurrentThread.ManagedThreadId);
}

6. 最佳實踐與常見問題

6.1 最佳實踐

  • 盡量使用線程池來管理線程
  • 避免過度同步
  • 使用異步編程模型來提高響應性和性能

6.2 常見問題

  • 死鎖
  • 競態條件
  • 線程饑餓

通過遵循最佳實踐和了解常見問題,可以編寫出高效、穩定的多線程程序。

以上是 C# 多線程并發編程的基礎內容,通過掌握這些基本概念和技巧,可以開始編寫高效的多線程應用程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75978.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75978.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75978.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Introduction to Reinforcement Learning】翻譯解讀2

2.2 馬爾可夫決策過程&#xff08;MDPs&#xff09; 馬爾可夫決策過程&#xff08;MDP&#xff09;為順序決策提供了框架&#xff0c;其中動作不僅影響即時獎勵&#xff0c;還會影響未來結果。與多臂老虎機問題不同&#xff0c;MDP中的即時獎勵與延遲獎勵相平衡。在多臂老虎機…

STM32單片機入門學習——第22節: [7-2] AD單通道AD多通道

寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難&#xff0c;但我還是想去做&#xff01; 本文寫于&#xff1a;2025.04.07 STM32開發板學習——第22節: [7-2] AD單通道&AD多通道 前言開發板說明引用解…

Python高階函數-filter

1. 基本概念 filter() 是Python內置的高階函數&#xff0c;用于過濾序列中的元素。它接收一個函數和一個可迭代對象作為參數&#xff0c;返回一個迭代器&#xff0c;包含使函數返回True的所有元素。 filter(function, iterable)2. 工作原理 惰性計算&#xff1a;filter對象是…

密碼學基礎——分組密碼的運行模式

前面的文章中文我們已經知道了分組密碼是一種對稱密鑰密碼體制&#xff0c;其工作原理可以概括為將明文消息分割成固定長度的分組&#xff0c;然后對每個分組分別進行加密處理。 下面介紹分組密碼的運行模式 1.電碼本模式&#xff08;ECB&#xff09; 2.密碼分組鏈接模式&…

Redlinux(2025.3.29)

1、將你的虛擬機的網卡模式設置為nat模式&#xff0c;給虛擬機網卡配置三個主機位分別為100、200、168的ip地址。(以nmtui命令為例) 2、測試你的虛擬機是否能夠ping通網關和dns&#xff0c;如果不能請修改網關和dns的地址。 首先打開虛擬網絡編輯器查看NAT設置里的網關IP&…

【PalladiumZ2 使用專欄 1 -- 波形 trigger 抓取詳細介紹】

文章目錄 Palladium Z2 OverviewPalladium 波形抓取Palladium 波形存放文件創建Palladium Trigger 斷點設置Palladium 加探針并 dumpPalladium 波形查看 Palladium Z2 Overview Cadence Palladium Z2 是 Cadence 推出的企業級硬件仿真加速平臺&#xff0c;旨在應對復雜 SoC 設…

Redisson分布式鎖:原理、使用

1. Redisson簡介 Redisson是一個基于Redis的Java客戶端庫&#xff0c;提供了豐富的分布式對象和服務&#xff08;如分布式鎖、信號量、Map等&#xff09;。其核心優勢在于??簡化分布式鎖的實現??&#xff0c;并解決了原生Redis分布式鎖的常見問題&#xff08;如死鎖、誤刪…

Java大廠面試題 -- JVM 優化進階之路:從原理到實戰的深度剖析(2)

最近佳作推薦&#xff1a; Java大廠面試題 – 深度揭秘 JVM 優化&#xff1a;六道面試題與行業巨頭實戰解析&#xff08;1&#xff09;&#xff08;New&#xff09; 開源架構與人工智能的融合&#xff1a;開啟技術新紀元&#xff08;New&#xff09; 開源架構的自動化測試策略優…

MySQL學習筆記(四)——DML和DQL

目錄 1. DML 1.1 添加數據 1.1.1 給指定字段添加數據 1.1.2 給全部字段添加數據 1.1.3 批量添加數據 1.2 修改數據 1.3 刪除數據 2. DQL 2.1 基本語法 2.2 基礎查詢 2.2.1 查詢多個字段 2.2.2 字段設置別名 2.2.3 去除重復記錄 2.3 條件查詢 2.4 聚合函數 2.5 …

DeepSeek-MLA

MLA 結構 需要緩存 KV 向量共用的壓縮隱特征K 向量多頭共享的帶位置編碼的向量 為什么帶有位置信息的 Q 向量來自于隱特征向量&#xff0c;而帶有位置的 K 向量來自于 H 向量且共享呢&#xff1f; 最好的方法肯定是從H向量直接計算并且不共享&#xff0c;但是會大大增加顯存使…

檢索增強技術RAG和向量數據庫技術的優勢和劣勢,應用范圍和價值

RAG 和向量數據庫在技術棧中處于不同層級&#xff0c;前者側重生成任務的準確性與動態性&#xff0c;后者專注檢索效率與擴展性。在實際應用中&#xff0c;二者常協同工作&#xff0c;但也可獨立服務于不同場景。企業需根據需求選擇&#xff1a;若需生成內容&#xff0c;RAG 是…

Python爬蟲教程013:使用CrawlSpider爬取讀書網數據并保存到mysql數據庫

文章目錄 3.8 CrawlSpider介紹3.9 CrawlSpider爬取讀書網案例3.9.1 創建項目3.9.2 定義要爬取的數據結構3.9.3 獲取數據3.9.4 保存數據到本地3.9.5 保存數據到mysql數據庫3.9.6 完整項目下載3.8 CrawlSpider介紹 CrawlSpider 是 Scrapy 框架中 最常用的高級爬蟲類之一,用于構…

Three.js 系列專題 5:加載外部模型

內容概述 Three.js 支持加載多種 3D 文件格式(如 GLTF、OBJ、FBX),這讓開發者可以直接使用專業建模軟件(如 Blender、Maya)創建的復雜模型。本專題將重點介紹 GLTF 格式的加載,并調整模型的位置和材質。 學習目標 理解常見 3D 文件格式及其特點。掌握使用 GLTFLoader 加…

P1006 [NOIP 2008 提高組] 傳紙條 題解

題目傳送門 前言 每次準備摸魚時都在這道題的界面。 今天有空做做&#xff0c;順便寫一波題解&#xff0c;畢竟估值蹭蹭往下跳。 雙倍經驗&#xff1a;P1004 [NOIP 2000 提高組] 方格取數&#xff0c;P1006 [NOIP 2008 提高組] 傳紙條。 題意簡述 現有一個 m m m 行 n …

LLM架構解析:長短期記憶網絡(LSTM)(第三部分)—— 從基礎原理到實踐應用的深度探索

本專欄深入探究從循環神經網絡&#xff08;RNN&#xff09;到Transformer等自然語言處理&#xff08;NLP&#xff09;模型的架構&#xff0c;以及基于這些模型構建的應用程序。 本系列文章內容&#xff1a; NLP自然語言處理基礎詞嵌入&#xff08;Word Embeddings&#xff09…

ffmpeg提取字幕

使用ffmpeg -i test.mkv 獲取視頻文件的字幕流信息如下 Stream #0:4(chi): Subtitle: subrip (srt) (default) Metadata: title : chs Stream #0:5(chi): Subtitle: subrip (srt) Metadata: title : cht Stream #0:6(jpn)…

Python設計模式:構建模式

1. 什么是構建模式 構建模式&#xff08;Builder Pattern&#xff09;是一種創建型設計模式&#xff0c;它允許使用多個簡單的對象一步步構建一個復雜的對象。構建模式通過將構建過程與表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。換句話說&#xff0c;構建模…

使用 VIM 編輯器對文件進行編輯

一、VIM 的兩種狀態 VIM&#xff08;vimsual&#xff09;是 Linux/UNIX 系列 OS 中通用的全屏編輯器。vim 分為兩種狀態&#xff0c;即命令狀態和編輯狀態&#xff0c;在命令狀態下&#xff0c;所鍵入的字符系統均作命令來處理&#xff1b;而編輯狀態則是用來編輯文本資料&…

GaussDB回調機制深度實踐:從事件驅動到系統集成

GaussDB回調機制深度實踐&#xff1a;從事件驅動到系統集成 一、回調機制核心概念 回調類型矩陣 二、核心實現技術棧 觸發器回調開發 sql -- 創建審計觸發器回調 CREATE OR REPLACE FUNCTION audit_trigger() RETURNS TRIGGER AS $$ BEGININSERT INTO audit_log (operati…

AI小白:AI算法中常用的數學函數

文章目錄 一、激活函數1. Sigmoid2. ReLU&#xff08;Rectified Linear Unit&#xff09;3. Tanh&#xff08;雙曲正切&#xff09;4. Softmax示例代碼&#xff1a;激活函數的實現 二、損失函數1. 均方誤差&#xff08;MSE&#xff09;2. 交叉熵損失&#xff08;Cross-Entropy&…