1.併發編程概述

優秀軟件的一個關鍵特徵就是具有併發性。過去的幾十年,我們可以進行併發編程,但是難度很大。以前,併發性軟件的編寫、調試和維護都很難,這導致很多開發人員爲圖省事放棄了併發編程。新版.NET 中的程序庫和語言特徵,已經讓併發編程變得簡單多了。隨着Visual Studio 2012 的發佈,微軟明顯降低了併發編程的門檻。以前只有專家才能做併發編程,而今天,每一個開發人員都能夠(而且應該)接受併發編程。

1.1簡介

首先,我來解釋幾個貫穿本書始終的術語。先來介紹併發。

  • 併發
    同時做多件事情

這個解釋直接表明了併發的作用。終端用戶程序利用併發功能,在輸入數據庫的同時響應用戶輸入。服務器應用利用併發,在處理第一個請求的同時響應第二個請求。只要你希望程序同時做多件事情,你就需要併發。幾乎每個軟件程序都會受益於併發。大多數開發人員一看到“併發”就會想到“多線程”。對這兩個概念,需要做一下區分。

  • 多線程
    併發的一種形式,它採用多個線程來執行程序。

從字面上看,多線程就是使用多個線程,多線程是併發的一種形式,但不是唯一的形式。實際上,直接使用底層線程類型在現代程序中基本不起作用。比起老式的多線程機制,採用高級的抽象機制會讓程序功能更加強大、效率更高因此,這裏儘量不涉及一些過時的技術。書中所有多線程的方法都採用高級類型,而不是Thread或BackgroundWorker。

一旦你輸入new Thread(),那就糟糕了,說明項目中的代碼太過時了。

但是,不要認爲多線程已經徹底被淘汰了!因爲線程池要求多線程繼續存在。線程池存放任務的隊列,這個隊列能夠根據需要自行調整。相應地,線程池產生了另一個重要的併發形式:並行處理

  • 並行處理
    把正在執行的大量的任務分割成小塊,分配給多個同時運行的線程。

爲了讓處理器的利用效率最大化,並行處理(或並行編程)採用多線程。當現代多核CPU執行大量任務時,若只用一個核執行所有任務,而其他覈保持空閒,這顯然是不合理的。並行處理把任務分割成小塊並分配給多個線程,讓它們在不同的核上獨立運行。並行處理是多線程的一種,而多線程是併發的一種。在現代程序中,還有一種非常重要但很多人還不熟悉的併發類型:異步編程

  • 異步編程
    併發的一種形式,它採用future 模式或回調(callback)機制,以避免產生不必要的線程。

一個future(或promise)類型代表一些即將完成的操作。在.NET 中,新版future 類型有Task 和Task。在老式異步編程API 中,採用回調或事件(event),而不是future。異步編程的核心理念是異步操作:啓動了的操作將會在一段時間後完成。這個操作正在執行時,不會阻塞原來的線程。啓動了這個操作的線程,可以繼續執行其他任務。當操作完成時,會通知它的future,或者調用回調函數,以便讓程序知道操作已經結束。異步編程是一種功能強大的併發形式,但直至不前,實現異步編程仍需要特別複雜的代碼。VS2012 支持async 和await,這讓異步編程變得幾乎和同步(非併發)編程一樣容易。併發編程的另一種形式是響應式編程(reactive programming)。異步編程意味着程序啓動一個操作,而該操作將會在一段時間後完成。響應式編程與異步編程非常類似,不過它是基併發編程概述 | 3於異步事件(asynchronous event)的,而不是異步操作(asynchronous operation)。異步事件可以沒有一個實際的“開始”,可以在任何時間發生,並且可以發生多次,例如用戶輸入。

  • 響應式編程
    一種聲明式的編程模式,程序在該模式中對事件做出響應。

如果把一個程序看作一個大型的狀態機,則該程序的行爲便可視爲它對一系列事件做出響應,即每換一個事件,它就更新一次自己的狀態。這聽起來很抽象和空洞,但實際上並非如此。利用現代的程序框架,響應式編程已經在實際開發中廣泛使用。響應式編程不一定是併發的,但它與併發編程聯繫緊密,因此本書介紹了響應式編程的基礎知識。通常情況下,一個併發程序要使用多種技術。大多數程序至少使用了多線程(通過線程池)和異步編程。要大膽地把各種併發編程形式進行混合和匹配,在程序的各個部分使用合適的工具。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章