Boost程式設計之--使用thread類提高執行緒開發效率
用Windows API寫執行緒,最痛苦的莫過於:
1. 記不住CreateThread長長的引數,對於普通人,引數超過3個,就變得很難記住了。
2. 執行緒引數表只有一個LPVOID,多引數情況下,我需要將其封裝在類或者結構體裡。
3. 變數的同步與異常處理。
比如我想建立兩個執行緒,第一個執行緒輸出: Thread1 : 1 ~ Thread1: 5;第二個執行緒接著輸出:Thread2 : 6 ~ Thread2 : 10。兩個執行緒共用一個int變數,從1遞增到10。輸出如下圖:
、
以下是我用WIN32 API寫的程式碼,是不是覺得比較麻煩?對於多引數,我痛恨每次都要寫個struct指標來將其傳遞給執行緒,為什麼執行緒不能是多引數的?Windows視窗訊息起碼還包括了WPARAM和LPARAM兩個引數。
#include <windows.h> #include <iostream> #include <string> using namespace std; struct MyStruct { string str; volatile int* nIndex; }; CRITICAL_SECTION CK; DWORD WINAPI Win32_Thread(LPVOID pStruct) { EnterCriticalSection(&CK); MyStruct* myStruct = (MyStruct*)(pStruct); for (int i = 0; i < 5; ++i) { cout << myStruct->str << ": " << ++(*myStruct->nIndex) << endl; } LeaveCriticalSection(&CK); return 0; } int main() { // 建立臨界區。 ::InitializeCriticalSection(&CK); // 建立第一個執行緒,輸出Thread1。 MyStruct myStruct; myStruct.nIndex = new int; *myStruct.nIndex = 0; myStruct.str = "Thread1"; DWORD dwID1, dwID2; ::CreateThread(NULL, 0, &Win32_Thread, &myStruct, 0, &dwID1); // 建立第二個執行緒,輸出Thread2。 MyStruct myStruct2; myStruct2.nIndex = myStruct.nIndex; myStruct2.str = "Thread2"; ::CreateThread(NULL, 0, &Win32_Thread, &myStruct2, 0, &dwID2); // 等待兩個執行緒結束。 ::Sleep(3000); // 銷燬臨界區及新建的指標。 DeleteCriticalSection(&CK); delete myStruct.nIndex; myStruct.nIndex = NULL; getchar(); return 0; }
接下來,讓我們看看用Boost庫編寫,會將程式碼簡化到何種程度:
輸出結果如下:#include <windows.h> #include <iostream> #include <boost/thread.hpp> #include <boost/atomic.hpp> #include <boost/ref.hpp> using namespace std; using namespace boost; mutex io_mutex; // 執行緒print,不再需要DWORD WINAPI這個聲明瞭。 // 當然LPVOID也消失了,thread類最多支援9個引數。 void print(atomic_int& nIndex, const string& str) { mutex::scoped_lock lock(io_mutex); for (int i = 0; i < 5; ++i) { cout << str << ": " << ++(nIndex) << endl; } } int main() { // 原子操作。 atomic_int nIndex = 0; // 建立兩個執行緒,傳入兩個引數,一個是nIndex的引用,另一個是字串。 thread(print, boost::ref(nIndex), "Hello"); thread(print, boost::ref(nIndex), "Boost"); getchar(); return 0; }
短短几行程式碼,就完成了該功能,是不是很有效率?不僅如此,我還發現了其他優點:
1. 臨界區的編寫不再有初始化和釋放等操作,這將有利於異常處理。
2. 從頭到尾沒有見到指標的宣告與操作,指標傳遞被boost::ref()替代了。
3. 支援多引數傳遞,最大傳遞的引數個數為9個;
4. 只要是個函式,都可以將其用作執行緒,而不再需要格式化的宣告為:DWORD WINAPI fun(LPVOID lpPram);
小結:在日常工作中,如果涉及到執行緒的開發,不妨先考慮下Boost庫。
相關推薦
Boost程式設計之--使用thread類提高執行緒開發效率
用Windows API寫執行緒,最痛苦的莫過於: 1. 記不住CreateThread長長的引數,對於普通人,引數超過3個,就變得很難記住了。 2. 執行緒引數表只有一個LPVOID,多引數情況下,
java 多執行緒之利用Thread類建立執行緒(Day02)
前言:在一個程式中,如果一次只完成一件事情,很容易實現,但現實生活中很多事情都是同時進行的,所以在java中為了模擬這種狀態,引入了執行緒機制,簡單的說,當程式同時完成很多事情時,就是所謂的多執行緒。 實現執行緒的兩種方式:一是通過繼承Thread類來建立執行緒,另一種方法
C++使用thread類多執行緒程式設計
C++11中引入了一個用於多執行緒操作的thread類,簡單多執行緒示例: #include <iostream> #include <thread> #include &l
Java多執行緒方面的程式設計筆試題(通過繼承Thread類啟動執行緒)
/* * 寫兩個執行緒,一個執行緒列印 1~52,另一個執行緒列印字母A-Z。列印順序為12A34B56C……5152Z。要求用執行緒間的通訊。 * 注:分別給兩個物件構造一個物件o,數字每列印兩
學習筆記之執行緒、Thread類和執行緒終止相關整理(下)——執行緒異常&JVM停止
提到執行緒的中斷在某些情況下會丟擲InterruptedException異常,最終導致執行緒的終止。其實,執行緒也有可能由於其他異常原因造成終止,在某些情況下為了做一些妥善的處理,我們需要捕獲這些異常情況。看下面程式碼,覺得會怎樣? 1 2 3 4 5
Java併發程式設計之set集合的執行緒安全類你知道嗎
Java併發程式設計之-set集合的執行緒安全類 Java中set集合怎麼保證執行緒安全,這種方式你知道嗎? 在Java中set集合是 本篇是《凱哥(凱哥Java:kagejava)併發程式設計學習》系列之《併發集合系列》教程的第二篇: 本文主要內容:Set集合子類底層分別是什麼?基於底層為什麼set的子類可
32-多執行緒--概述+Thread類+多執行緒的建立方式(繼承Thread類+實現Runnable介面)+Runnable介面+執行緒的名稱+執行緒的狀態
一、概述 1、程序:對應的是一個應用程式在記憶體中的所屬空間。程序是不直接執行的,它只是在分配該應用程式的記憶體空間 注:如果一個程式在記憶體中開闢了空間,就代表它在執行。不執行要釋放空間 2、執行緒:程序中的一個負責程式執行的控制單元,也叫執行路徑。一個程序中可以有多個執行路徑,稱之為
Java多執行緒01(Thread類、執行緒建立、執行緒池)
Java多執行緒(Thread類、執行緒建立、執行緒池) 第一章 多執行緒 1.1 多執行緒介紹 1.1.1 基本概念 程序:程序指正在執行的程式。確切的來說,當一個程式進入記憶體執行,即變成一個程序,程序是處於執行過程中的程式,並且具有一定獨立功能。 執行緒:執行緒是程序中的一個執行單元,
【C/C++多執行緒程式設計之十】pthread執行緒私有資料
#include #include #include #include #pragma comment(lib, "pthreadVC2.lib") //必須加上這句 pthread_key_t key; pthread_mutex_t mutex; pthread_t tid1,*p1;
【Java併發程式設計】之六:Runnable和Thread實現多執行緒的區別(含程式碼)
Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Th
Boost程式設計之--慎用執行緒的this_thread::yield()方法
在看書時,瞭解到boost執行緒中的yield方法:可以將本執行緒的CPU時間片放棄,並允許其他執行緒執行。認為其是一個操作執行緒之利器,所以寫了個3個執行緒,迴圈列印ABC字串,以驗證其交出時間片功
[python] 專題八.多執行緒程式設計之thread和threading
就個人而言,學了這麼多年的課程又寫了這麼多年的程式,雖然沒有涉及到企業級的專案,但還是體會到了有幾個知識點是非常重要的,包括:面向物件的思想、如何架構一個專案、設計模式來具體解決問題、應用機器學習和深度學習的方法,當然也包括我這篇文章的內容——多執行緒和並行
Java多執行緒程式設計之Thread和Runnable的區別
Thread 和Runnable的最大區別就在於共享資料。每當你new一個Thread的時候,虛擬機器會給你new出來的Thread分配一塊單獨的記憶體。Thread和Thread物件之間的資料不共享。如下: Example1: class Thread1 extends
Java併發程式設計從入門到精通 之 第四章 執行緒安全的集合類
java.util.HashTable:-1 說明:Hashtable函式均為同步,是執行緒安全,key,value均不能為null。-2 基本方法:get(), put(), remove(), clear(), putAll(), contains(),containsK
Java併發程式設計(6):Runnable和Thread實現多執行緒的區別(含程式碼)
Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Thread類有如下優勢: 1、可以避免由於Java的單繼承特性而帶來的侷限; 2、增強程式的健壯性,程式碼能夠被多個執行
Java分析系列之四:jstack生成的Thread Dump日誌執行緒狀態
前面文章中只分析了Thread Dump日誌檔案的結構,今天針對日誌檔案中 Java EE middleware, third party & custom application Threads 部分執行緒的狀態進行詳細的分析。 目錄 [隱藏] 1 Thread Dump日誌
《Java多執行緒程式設計實戰》—— 第9章 Thread Pool(執行緒池)模式
一個系統中的執行緒相對於其所要處理的任務而言,是一種非常有限的資源。執行緒不僅在執行任務時需要消耗CPU時間和記憶體等資源,執行緒物件(Thread例項)本身以及執行緒所需的呼叫棧(Call Stack)也佔用記憶體,並且Java中建立一個執行緒往往意味著JVM會建立相應的依賴於宿主機作業系
java 使用RandomAssessFile類多執行緒切片下載檔案之伺服器如何實現
因為之前寫的都是客戶端,不需要去管服務端,直接把檔案放伺服器裡面,直接訪問,伺服器(tomcat之類得)就會自動幫我們切片,之類的。然後我自己想測試一些直接訪問檔案和使用控制器io讀寫返回檔案哪個快一些(肯定是io)https://blog.csdn.net/yali_a
提高C++效能的程式設計技術筆記:多執行緒記憶體池+測試程式碼
為了使多個執行緒併發地分配和釋放記憶體,必須在分配器方法中新增互斥鎖。 全域性記憶體管理器(通過new()和delete()實現)是通用的,因此它的開銷也非常大。 因為單執行緒記憶體管理器要比多執行緒記憶體管理器快的多,所以如果要分配的大多數記憶體塊限於單執行緒中使用,那麼可以顯著提升效
提高C++效能的程式設計技術筆記:單執行緒記憶體池+測試程式碼
頻繁地分配和回收記憶體會嚴重地降低程式的效能。效能降低的原因在於預設的記憶體管理是通用的。應用程式可能會以某種特定的方式使用記憶體,並且為不需要的功能付出效能上的代價。通過開發專用的記憶體管理器可以解決這個問題。對專用記憶體管理器的設計可以從多個角度考慮。我們至少可以想到兩個方面:大小和併發。