1. 程式人生 > >Boost程式設計之--使用thread類提高執行緒開發效率

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++效能的程式設計技術筆記:單執行記憶體池+測試程式碼

頻繁地分配和回收記憶體會嚴重地降低程式的效能。效能降低的原因在於預設的記憶體管理是通用的。應用程式可能會以某種特定的方式使用記憶體,並且為不需要的功能付出效能上的代價。通過開發專用的記憶體管理器可以解決這個問題。對專用記憶體管理器的設計可以從多個角度考慮。我們至少可以想到兩個方面:大小和併發。