国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

多線程編程系列之線程間通信和協作

開發 前端
在多線程編程中,有時我們需要多個線程協作完成一個復雜的任務。這些線程需要互相通信、協調以達到同一目標。

一、 線程間通信的方式和實現

在多線程編程中,線程間通信是非常常見的需求,它指的是多個線程之間通過某種機制來交換信息,協調彼此的行為。線程間通信的方式常用的有以下幾種:

共享內存:線程之間可以通過共享內存來交換信息,每個線程擁有對共享內存區域的讀寫權限。一般情況下需要使用鎖來保證共享內存的同步與互斥。

using System.Threading;

class Program {
    private static int data = 0;
    private static bool isRunning = true;

    static void Main(string[] args) {
        using (var mutex = new Mutex(false, "sharedMutex"))
        using (var mappedFile = MemoryMappedFile.CreateOrOpen("sharedMemory", 1024))
        using (var accessor = mappedFile.CreateViewAccessor()) {
            var thread1 = new Thread(() => {
                while (isRunning) {
                    mutex.WaitOne();
                    accessor.Write(0, data);
                    mutex.ReleaseMutex();
                    Thread.Sleep(1000);
                }
            });
            var thread2 = new Thread(() => {
                while (isRunning) {
                    mutex.WaitOne();
                    data = accessor.ReadInt32(0);
                    mutex.ReleaseMutex();
                    Console.WriteLine($"Data received: {data}");
                    Thread.Sleep(1000);
                }
            });

            thread1.Start();
            thread2.Start();

            Console.WriteLine("Press enter to exit.");
            Console.ReadLine();

            isRunning = false;
            thread1.Join();
            thread2.Join();
        }
    }
}

該程序創建了一個名為 sharedMemory 的內存映射文件和一個名為 sharedMutex 的互斥對象。兩個線程分別負責將數據寫入內存映射文件和讀取內存映射文件中的數據。在操作前,需要通過互斥對象進行同步與互斥。

消息傳遞:線程之間可以通過發送消息來交換信息,每個線程擁有一個接收緩沖區和一個發送緩沖區。這里的消息指的是數據包或者數據流,線程之間通過操作緩沖區來完成數據交換。

using System.Collections.Concurrent;

class Program {
    private static bool isRunning = true;
    private static BlockingCollection<string> messageQueue = new BlockingCollection<string>();

    static void Main(string[] args) {
        var thread1 = new Thread(() => {
            while (isRunning) {
                var message = messageQueue.Take();
                Console.WriteLine($"Thread 1 received message: {message}");
            }
        });
        var thread2 = new Thread(() => {
            while (isRunning) {
                var message = messageQueue.Take();
                Console.WriteLine($"Thread 2 received message: {message}");
            }
        });

        thread1.Start();
        thread2.Start();

        // Simulate sending some messages
        messageQueue.Add("Hello from thread 1");
        messageQueue.Add("Hello from thread 2");
        messageQueue.Add("Hello again from thread 1");
        messageQueue.Add("Goodbye from thread 2");

        Console.WriteLine("Press enter to exit.");
        Console.ReadLine();

        isRunning = false;
        thread1.Join();
        thread2.Join();
    }
}

該程序使用 BlockingCollection<T> 類來實現簡單的消息隊列,兩個線程分別負責從消息隊列中取出消息并進行處理。在發送消息時,可以將其添加到消息隊列中。

管道:線程之間可以通過管道來交換信息,一個線程將數據寫入管道,另一個線程則從管道中讀取數據。管道本質上也是一種共享內存的方式,并且會自動進行同步(管道的大小是有限制的)

信號量:線程之間可以通過信號量來同步和互斥訪問資源,一個線程獲取信號量后就可以進行訪問操作,其他線程則需要等待。信號量可以用于實現進程之間的同步和互斥,但在多線程應用中使用時需要注意信號量的實現。

using System.Threading;

class Program {
    private static bool isRunning = true;
    private static AutoResetEvent signal = new AutoResetEvent(false);

    static void Main(string[] args) {
        var thread1 = new Thread(() => {
            while (isRunning) {
                Console.WriteLine("Thread 1 is waiting...");
                signal.WaitOne();
                Console.WriteLine("Thread 1 received signal.");
            }
        });

        var thread2 = new Thread(() => {
            while (isRunning) {
                Console.WriteLine("Thread 2 is waiting...");
                signal.WaitOne();
                Console.WriteLine("Thread 2 received signal.");
            }
        });

        thread1.Start();
        thread2.Start();

        // Send signals to the threads
        signal.Set(); // signals only one of the waiting threads
        signal.Set(); // signals the other waiting thread

        Console.WriteLine("Press enter to exit.");
        Console.ReadLine();

        isRunning = false;
        signal.Set(); // unblock any waiting threads
        thread1.Join();
        thread2.Join();
    }
}

該程序使用 AutoResetEvent 類來實現線程間的同步。兩個線程等待信號并進行處理,主線程發送信號來通知等待的線程進行處理。可以使用 Set() 方法發送信號并使用 WaitOne() 方法等待信號。

using System.Threading;

class Program {
    private static bool isRunning = true;
    private static ManualResetEvent signal = new ManualResetEvent(false);

    static void Main(string[] args) {
        var thread1 = new Thread(() => {
            while (isRunning) {
                Console.WriteLine("Thread 1 is waiting...");
                signal.WaitOne();
                Console.WriteLine("Thread 1 received signal.");
                signal.Reset(); // reset the signal
            }
        });

        var thread2 = new Thread(() => {
            while (isRunning) {
                Console.WriteLine("Thread 2 is waiting...");
                signal.WaitOne();
                Console.WriteLine("Thread 2 received signal.");
                signal.Reset(); // reset the signal
            }
        });

        thread1.Start();
        thread2.Start();

        // Send signals to the threads
        signal.Set(); // signals both of the waiting threads

        Console.WriteLine("Press enter to exit.");
        Console.ReadLine();

        isRunning = false;
        signal.Set(); // unblock any waiting threads
        thread1.Join();
        thread2.Join();
    }
}

該程序使用 ManualResetEvent 類來實現線程間的同步。兩個線程等待信號并進行處理,主線程發送信號來通知等待的線程進行處理。可以使用 Set() 方法發送信號并使用 WaitOne() 方法等待信號,同時使用 Reset() 方法將信號狀態重置為未發出狀態,以便下次等待。

互斥鎖:線程之間可以通過互斥鎖來同步和互斥訪問共享資源,一個線程獲取鎖后就可以進行訪問操作,其他線程則需要等待釋放鎖。互斥鎖是一種經典的同步和互斥機制,在多線程編程中用得比較廣泛,一般和條件變量一起使用。

using System.Threading;

class Program {
    private static bool isRunning = true;
    private static object lockObject = new object();
    private static int counter = 0;

    static void Main(string[] args) {
        var thread1 = new Thread(() => {
            while (isRunning) {
                lock (lockObject) {
                    while (counter % 2 == 1) {
                        Monitor.Wait(lockObject);
                    }
                    Console.WriteLine($"Thread 1: {counter++}");
                    Monitor.PulseAll(lockObject);
                }
            }
        });

        var thread2 = new Thread(() => {
            while (isRunning) {
                lock (lockObject) {
                    while (counter % 2 == 0) {
                        Monitor.Wait(lockObject);
                    }
                    Console.WriteLine($"Thread 2: {counter++}");
                    Monitor.PulseAll(lockObject);
                }
            }
        });

        thread1.Start();
        thread2.Start();

        Console.WriteLine("Press enter to exit.");
        Console.ReadLine();

        isRunning = false;
        thread1.Join();
        thread2.Join();
    }
}

二、同步和異步線程間通信的比較

同步和異步線程間通信的主要區別在于調用者是否需要等待被調用者完成任務才能繼續執行下一步操作。

同步線程間通信指的是調用者主動向被調用者請求一個任務,并等待被調用者完成后再繼續執行。這種模式對于簡單的應用程序來說很容易實現,但有時會引發線程死鎖的問題,因為如果多個線程都在等待對方完成任務,就會形成死循環。

異步線程間通信則是被調用者在處理任務的同時,通知調用者任務的狀態。這種模式可以提高程序的響應速度,因為調用者可以繼續執行其他任務,而不必等待被調用者完成任務才能進行下一步操作。

C# 語言提供了多種方式來實現線程間的同步和異步通信。其中,同步通信可以使用 Mutex、Semaphore 和 Monitor 等互斥量類來實現線程鎖定和等待,在獲取到資源后再釋放鎖定。異步通信可以使用委托、事件和 Completion 是C# 5.0 開始的異步編程功能,可以使用 async 和 await 關鍵字來快速實現異步編程。

三、 多個線程協作完成任務

在多線程編程中,有時我們需要多個線程協作完成一個復雜的任務。這些線程需要互相通信、協調以達到同一目標。下面是一些常用的多線程協作技術:

信號量 Semaphore:Semaphore 可以用來控制某一資源的訪問權,比如網絡連接數限制、數據庫連接池等。Semaphore 通過計數器來控制資源的數量,并提供了 Acquire 和 Release 等方法來允許或阻塞線程訪問資源。多個線程可以共享一個 Semaphore,當 Semaphore 計數為 0 時,其他線程就需要等待。

Mutex:Mutex 是一種操作系統提供的同步機制,它可以保證在同一時刻只有一個線程訪問共享資源。Mutex 提供了 Lock 和 Unlock 等方法來保護臨界區。如果一個線程獲得 Mutex,其他線程就必須等待直到該線程釋放 Mutex。

AutoResetEvent 和 ManualResetEvent:這兩種事件用于線程間的同步,AutoResetEvent 的 WaitOne 方法會阻塞當前線程直到事件被發出,發出后事件重置為未發出狀態;ManualResetEvent 則不會自動重置,需要調用 Reset 方法手動將事件重置為未發出狀態。

CountdownEvent:CountdownEvent通常用于多個線程都需要完成某個任務后才能繼續執行的場景。當所有線程都完成任務后,調用Done方法通知CountdownEvent,等待的線程就會被喚醒。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-06-07 13:49:00

多線程編程C#

2023-06-09 07:59:37

多線程編程鎖機制

2009-03-12 10:52:43

Java線程多線程

2023-06-13 13:39:00

多線程異步編程

2017-08-07 20:18:11

Android線程handler

2023-06-05 07:56:10

線程分配處理器

2023-06-06 08:17:52

多線程編程Thread類

2019-09-16 08:45:53

并發編程通信

2021-09-17 14:43:54

鴻蒙HarmonyOS應用

2011-06-13 10:41:17

JAVA

2023-06-12 08:30:08

多線程編程線程調試

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門

2023-12-13 09:56:13

?多進程多線程協程

2011-06-24 11:03:31

Qt 多線程 線程

2011-06-24 11:12:39

Qt 多線程 線程

2022-11-13 15:48:19

編程線程GPU

2021-01-28 11:17:49

Python爬蟲單線程

2013-07-16 12:13:27

iOS多線程多線程概念GCD

2013-07-16 10:57:34

iOS多線程多線程概念多線程入門

2023-04-02 17:53:10

多線程編程自測
點贊
收藏

51CTO技術棧公眾號

亚洲一级黄色| 亚洲精品五月天| 97国产在线视频| 欧美日韩伦理片| 美女高潮久久久| 日本99精品| 精品日本美女福利在线观看| 日韩一区免费观看| 久草精品在线| 日韩电影第一页| 亚州色图欧美色图| 成人97人人超碰人人99| 91精品久久久久久久久久| 亚洲天堂资源| 91成人免费在线| 别急慢慢来1978如如2| 日韩不卡免费视频| 91在线免费视频| 天天躁日日躁成人字幕aⅴ| 精品欧美乱码久久久久久1区2区| 啦啦啦啦免费高清视频在线观看1| 国产成人精品免费网站| 国产亚洲精品久久飘花| 99国产精品免费网站| 日韩av中文字幕在线免费观看| 香蕉视频在线观看免费| 久久久精品2019中文字幕之3| 日本成人三级| 秋霞午夜在线观看| 日本一区二区视频在线观看| 亚洲精品不卡| **女人18毛片一区二区| 久久久免费高清电视剧观看| 日韩国产激情| 亚洲国产精品视频在线观看| 亚洲人成电影| 亚洲国产色一区| 国产九一视频| 成人免费在线视频观看| 欧美一区二区中文字幕| 经典三级在线一区| 91在线视频观看免费| 在线观看国产精品入口| 91九色国产在线| 欧美超碰在线| 国产亚洲精品日韩| 波多野结衣中文字幕久久| 午夜激情一区| 蜜桃视频免费观看一区| 99re在线视频播放| 视频欧美一区| 中文字幕九色91在线| 人在线成免费视频| 亚洲精品美女视频| www.综合网.com| 亚洲国产成人精品女人久久久 | 欧美一区二区三区系列电影| 国产一区二区高清不卡| 亚洲乱码在线| 147欧美人体大胆444| 国产精品大片| 色噜噜狠狠色综合网| 国内精品不卡在线| 国产精品333| 亚洲三级电影全部在线观看高清| 成人高清在线观看| 99精品久久| 潘金莲一级淫片aaaaa免费看| 国产揄拍国内精品对白| 国产精品一区二区免费在线观看| 久久久久国产精品麻豆| 国产黄色免费网| 在线观看视频91| 女同一区二区免费aⅴ| 亚洲欧美在线一区| 精品五月天堂| 福利视频久久| 国产久卡久卡久卡久卡视频精品| 任你操这里只有精品| 亚洲午夜在线视频| 伊人222成人综合网| 中文字幕日韩在线播放| 成人另类视频| a∨色狠狠一区二区三区| 日韩大片在线观看视频| 国产一区二区视频在线看| 国产91精品网站| 久久久国产精品一区二区中文| 久久久精品美女| 色爱综合av| 精品欧美一区二区久久久伦 | 九九热精品视频在线播放| 欧美美女一区| 在线观看欧美一区| 亚洲人精品一区| 国产日韩欧美a| a级黄色片网站| 久久99精品网久久| 九九久久九九久久| 亚洲午夜免费视频| 超碰资源在线| 热久久99这里有精品| 亚洲人妖在线| 丰满少妇在线观看| 欧美日韩视频一区二区| 国产精品一级在线观看| 国产欧美日韩一区二区三区| 91色视频在线| 精品日本一区二区三区| 国产盗摄女厕一区二区三区| 美女视频黄a视频全免费观看| 日韩成人久久久| 欧美国产美女| 成人免费观看cn| 欧美日韩美少妇| 中文有码一区| 日韩精品一区二区免费| 欧美吞精做爰啪啪高潮| 欧美精品密入口播放| 欧美大片免费播放| 欧美日韩精品一区二区三区蜜桃 | 免费a级在线播放| 91国产中文字幕| 免费久久99精品国产| 午夜在线观看91| 欧美疯狂xxxx大交乱88av| 美女诱惑一区二区| 日本一区视频| 欧美在线一级视频| 久久综合中文字幕| www.成人爱| 五月天色一区| 欧美日韩中文精品| 久久精品青草| 日本电影免费看| 国内精品久久久久久影视8| 国产在线国偷精品产拍免费yy| www亚洲人| 国产精品美乳在线观看| 欧美韩一区二区| 亚洲啊啊啊啊啊| 欧美一区二区三区在线观看| 欧美电影一二区| 手机福利视频欧美| 欧美性猛交xxxx免费看久久久| 日韩第一区第二区| 伊人久久在线观看| 日韩一区二区三区视频在线| 久久精品国内一区二区三区水蜜桃| 亚洲天堂网一区| 欧美日韩第一视频| 91老师片黄在线观看| 日韩av电影资源网| 天堂а√在线中文在线| 久久久久久久免费视频了| 51精品视频| 四虎影院一区二区三区| 欧美一二三区在线观看| 一本久道久久综合狠狠爱| caoporn国产精品免费视频| 99re资源| 欧美亚洲动漫另类| 亚洲美女一区| 图片区小说区亚洲| 水蜜桃一区二区| 日韩成人av在线| 国产一区二区电影| 99只有精品| 免费无遮挡无码永久视频| 日韩中文字幕在线视频| 91在线免费播放| 极品一区美女高清| 男女午夜刺激视频| 成人h猎奇视频网站| 欧美性生活久久| 亚洲欧美大片| 波多野结衣久久| 日本福利视频一区| 欧美精品videossex性护士| 亚洲三级在线免费观看| 天天插综合网| 污片在线免费观看| 欧美极品欧美精品欧美| 欧美激情性做爰免费视频| 一区二区三区在线看| 污污的网站在线看| a级网站在线观看| 久久久精品网站| 亚洲综合在线视频| 在线午夜精品| 韩日成人影院| 成人黄网18免费观看的网站| 国产日韩欧美在线观看| 欧美男生操女生| 国产成a人亚洲精| 精品国产一区二区三区| 尤物视频在线免费观看| 青青草视频国产| 国产一区一一区高清不卡| 亚洲在线播放电影|