1. 程式人生 > >boost 多執行緒

boost 多執行緒

void wait(int seconds){
	boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒數
}
void boost_thread(){
	//新的執行緒建立
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	for (int i=0;i<5;i++)
	{
		wait(i);
		TRACE("執行緒執行%d\n",i);
	}
	TRACE("執行緒結束\n");
}
void CMFC08Dlg::OnBnClickedButton2()
{
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	boost::thread t(boost_thread);//一旦構造這個thread物件,執行緒就立刻執行
	t.join();//等待執行緒結束
	TRACE("建立執行緒函式結束\n");
}
void wait(int seconds){
	boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒數
}
void boost_thread(){
	//新的執行緒建立
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	try
	{
		for (int i=0;i<5;i++)
		{
			wait(i);
			TRACE("執行緒執行%d\n",i);
		}
	}
	catch (boost::thread_interrupted& )
	{
		TRACE("執行緒發生異常\n");//這個時候可以看到這裡有輸出
	}
	TRACE("執行緒結束\n");
}
void CMFC08Dlg::OnBnClickedButton2()
{
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	boost::thread t(boost_thread);//一旦構造這個thread物件,執行緒就立刻執行
	wait(3);//等待3秒,接下來來一箇中斷操作
	t.interrupt();//中斷執行緒執行
	t.join();//等待執行緒結束
	TRACE("建立執行緒函式結束\n");
}

	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	boost::thread::id bThreadID=boost::this_thread::get_id();//獲取當前的執行緒id物件
	string szThreadID=boost::lexical_cast<std::string>(bThreadID);
	unsigned int nThreadID=std::stoul(szThreadID,0,16);//獲取真實的執行緒ID比較複雜點
	int hardware_Concurrency=boost::thread::hardware_concurrency();//回基於CPU數目或者CPU核心數目的刻在同時在物理機器上執行的執行緒數

boost::mutex g_mutex;//建立一個全域性的互斥體
void wait(int seconds){
	boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒數
}
void boost_thread(){
	//新的執行緒建立
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	try
	{
		for (int i=0;i<5;i++)
		{
			wait(i);
			g_mutex.lock();//這是顯示呼叫mutex的類的鎖
			TRACE("%d,執行緒執行%d\n",GetCurrentThreadId(),i);
			g_mutex.unlock();//這是顯示呼叫mutex的類的解鎖
		}
	}
	catch (boost::thread_interrupted& )
	{
		TRACE("執行緒發生異常\n");//這個時候可以看到這裡有輸出
	}
	TRACE("執行緒結束\n");
}
void CMFC08Dlg::OnBnClickedButton2()
{
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	boost::thread t1(boost_thread);
	boost::thread t2(boost_thread);
	t1.join();
	t2.join();
}

boost::mutex g_mutex;
void wait(int seconds){
	boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒數
}
void boost_thread(){
	//新的執行緒建立
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	try
	{
		for (int i=0;i<5;i++)
		{
			wait(i);
			boost:lock_guard<boost::mutex> l_guard(g_mutex);//通過lock_guard 來進行構造鎖,並且析構的時候解鎖,方便呼叫並且保證鎖可以解鎖
			TRACE("%d,執行緒執行%d\n",GetCurrentThreadId(),i);
		}
	}
	catch (boost::thread_interrupted& )
	{
		TRACE("執行緒發生異常\n");//這個時候可以看到這裡有輸出
	}
	TRACE("執行緒結束\n");
}
void CMFC08Dlg::OnBnClickedButton2()
{
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	boost::thread t1(boost_thread);
	boost::thread t2(boost_thread);
	t1.join();
	t2.join();
}

boost::timed_mutex g_mutex;
void wait(int seconds){
	boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒數
}
void boost_thread(){
	//新的執行緒建立
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	try
	{
		for (int i=0;i<5;i++)
		{
			boost::unique_lock<boost::timed_mutex> l_unique(g_mutex,boost::try_to_lock);//構造時候使用try_to_lock
			wait(i);
			if(false==l_unique.owns_lock()){
				//try_to_lock 未必能夠鎖定成功
				bool blTimeLock=l_unique.timed_lock(boost::get_system_time()+boost::posix_time::seconds(1));//在一定時間內嘗試鎖,鎖成功返回true
				if(false==blTimeLock){
					TRACE("%d,執行緒暫時未鎖定\n",GetCurrentThreadId());
					continue;
				}
			}
			TRACE("%d,執行緒執行%d\n",GetCurrentThreadId(),i);
		}
	}
	catch (boost::thread_interrupted& )
	{
		TRACE("執行緒發生異常\n");//這個時候可以看到這裡有輸出
	}
	TRACE("執行緒結束\n");
}
void CMFC08Dlg::OnBnClickedButton2()
{
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	boost::thread t1(boost_thread);
	boost::thread t2(boost_thread);
	t1.join();
	t2.join();
}

void boost_fill(){
	std::srand(static_cast<unsigned int>(std::time(0)));
	for (int i=0;i<3;++i)
	{
		boost::unique_lock<boost::shared_mutex> lock(g_mutex);//寫入資料使用unique獨佔鎖,並且shared_lock兩個都沒有解鎖的情況下,這裡無法鎖住,如果這裡鎖住情況,則共享鎖無法鎖住
		random_number.push_back(i+1);
		lock.unlock();//這句可以註釋它,因為析構boost::unique_lock 析構會自動解鎖,如果註釋則需要wait 1秒才解鎖哦
		wait(1);
	}
}

void boost_print(){
	for (int i=0;i<3;++i)
	{
		wait(1);
		boost::shared_lock<boost::shared_mutex> lock(g_mutex);//讀取資料採用共享鎖,boost_print和boos_count可以同時訪問
		if( false == random_number.empty() ){
			int nNum=random_number.back();
			TRACE("%d,輸出,%d\n",GetCurrentThreadId(),nNum);
		}

	}
}

void boost_count(){
	int sum=0;
	for (int i=0;i<3;i++)
	{
		wait(1);
		boost::shared_lock<boost::shared_mutex> lock(g_mutex);//讀取資料採用共享鎖,boost_print和boos_count可以同時訪問
		if(false == random_number.empty()){
			int nNum=random_number.back();
			TRACE("%d,輸出,%d\n",GetCurrentThreadId(),nNum);
			sum+=nNum;
		}
	}
	TRACE("%d,結果,%d\n",GetCurrentThreadId(),sum);
}

void CMFC08Dlg::OnBnClickedButton2()
{
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	boost::thread t1(boost_fill);
	boost::thread t2(boost_print);
	boost::thread t3(boost_count);
	t1.join();
	t2.join();
	t3.join();
}

void boost_fill(){
	std::srand(static_cast<unsigned int>(std::time(0)));
	for (int i=0;i<3;++i)
	{
		boost::unique_lock<boost::mutex> lock(g_mutex);//獨佔鎖
		random_number.push_back(i+1);
		cond.notify_all();//通知其他執行緒
		cond.wait(g_mutex);//cond.wait 會釋放所有權,並且等待下一次的通知notify_all
	}
}

void boost_print(){
	std::size_t next_size=1;
	for (int i=0;i<3;++i)
	{
		wait(1);
		boost::unique_lock<boost::mutex> lock(g_mutex);//讀取資料採用共享鎖,boost_print和boos_count可以同時訪問
		while(random_number.size()!=next_size)
			cond.wait(g_mutex);//cond.wait 會釋放所有權,並且等待下一次的通知notify_all,佔據所有權

		int nNum=random_number.back();
		TRACE("%d,輸出,%d\n",GetCurrentThreadId(),nNum);
		++next_size;
		cond.notify_all();
		//注意這裡lock 會析構,所以boost_fill 函式中的 cond.wait 得以執行
	}
}

void CMFC08Dlg::OnBnClickedButton2()
{
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	random_number.clear();
	boost::thread t1(boost_fill);
	boost::thread t2(boost_print);
	
	t1.join();
	t2.join();
	
}

void boost_fill(){
	std::srand(static_cast<unsigned int>(std::time(0)));
	for (int i=0;i<3;++i)
	{
		boost::unique_lock<boost::mutex> lock(g_mutex);//獨佔鎖
		random_number.push_back(i+1);
		cond.notify_all();//通知其他執行緒
		cond.wait(g_mutex);//cond.wait 會釋放所有權,並且等待下一次的通知notify_all
	}
}

void boost_print(){
	std::size_t next_size=1;
	for (int i=0;i<3;++i)
	{
		wait(1);
		boost::unique_lock<boost::mutex> lock(g_mutex);//讀取資料採用共享鎖,boost_print和boos_count可以同時訪問
		while(random_number.size()!=next_size){
			cond.notify_all();//通知其他執行緒
			cond.wait(g_mutex);//cond.wait 會釋放所有權,並且等待下一次的通知notify_all,佔據所有權
		}

		int nNum=random_number.back();
		TRACE("%d,輸出,%d\n",GetCurrentThreadId(),nNum);
		++next_size;
		cond.notify_all();
		//注意這裡lock 會析構,所以boost_fill 函式中的 cond.wait 得以執行
	}
}

void CMFC08Dlg::OnBnClickedButton2()
{
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	random_number.clear();
	boost::thread t1(boost_fill);
	boost::thread t2(boost_print);
	
	t1.join();
	t2.join();
	
}

void init_number_generator(){
	boost::thread_specific_ptr<bool> tls;//thread local store
	if(false == tls.get()){//如果本執行緒並沒有分配一個物件的話,類似初始化
		tls.reset(new bool(false));//則初始化
	}

	if(*tls){//判斷初始化的物件是否已經重新設定值為true
		*tls=true;//否則初始化成功,保證每個執行緒都呼叫了隨機種子
		std::srand(static_cast<unsigned int>(std::time(0)));
	}
}

boost::mutex g_mutex;

void random_number_generator(){
	init_number_generator();
	int i=std::rand();
	boost::lock_guard<boost::mutex> lock(g_mutex);
	TRACE("%d\n",i);
}

void CMFC08Dlg::OnBnClickedButton2()
{
	TRACE("當前執行緒ID,%d\n",GetCurrentThreadId());
	boost::thread t[3];

	for (int i=0;i<3;i++)
	{
		t[i]=boost::thread(random_number_generator);
	}

	for(int i=0;i<3;i++){
		t[i].join();
	}
}


相關推薦

C++ Boost 執行(二),執行的引數傳遞

#include <iostream> #include <boost/thread.hpp> using namespace std; void func1(const i

C++使用Boost執行

首先從這裡下載boost的windows庫: https://www.boost.org/users/download/ 解壓執行bootstrap.bat 生成b2.exe之後執行b2.exe編譯庫 之後新建專案,在工程屬性->配置屬性->VC++目錄->包含目錄中新

Qt與Boost執行比較

雖然mdl開發不支援多執行緒,如果不涉及mdl的API還是可以使用多執行緒的,比如QT的UI部分和SQL部分都可以啟用多執行緒。Qt的和Boost的thread都可以使用。 比較糾結的是二者之間的便捷性不同。習慣了隨意使用function啟動一個執行緒,就像用windows

C++ Boost 執行(一),執行的建立

#include <iostream> #include <boost/thread.hpp> using namespace std; void func() { cou

關於 boost 執行(一)

關於 boost 多執行緒(一) 在純 C++ 開發中,執行緒的建立由 pthread_create 函式實現。成功返回0,出錯返回 -1.其函式原型為: int pthread_create(pthread_t *tidp,const pthread_at

C++ Boost 執行(九),生產者和消費者問題

#include <iostream> #include <boost/thread.hpp> using namespace std; class Account { pu

boost 執行

void wait(int seconds){ boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒數 } void boost_thread(){ //新的執行緒建立 TRACE("

C++ Boost 執行(六),執行的同步

#include <iostream> #include <boost/thread.hpp> using namespace std; boost::mutex mutex

boost執行程式設計(一)

一.thread執行緒的建立1.執行緒就是在程序空間中執行的一個函式2.執行緒建立時需要傳遞給thread物件一個函式物件或函式3.傳遞的函式有引數時,可以直接傳遞給thread物件,並在呼叫時候發生拷貝。4.引數較大時,可以傳遞給執行緒一個引用值,需要使用ref庫進行封裝。

boost執行之scoped_lock理解

最近突然用到了多執行緒,就把std::thread和boost::thread的文件都看了看,關於執行緒對共享區資源的訪問,有以下三種訪問方式: (1) 等到其他加鎖的執行緒全部解鎖完畢再加鎖; (

Boost(六)——執行

結合Boost官網 多執行緒的難點在於同步執行,需要“鎖”控制所有權。 鎖有分:互斥鎖,條件變數... 互斥鎖:boost::mutex 獲取和釋放成對存在,也可以用boost::lock_guard<boost::mutex> lock(mutex); boost::l

c/c++ 執行 ubuntu18.04 boost編譯與執行的坑

多執行緒 boost編譯與執行的坑 背景:因為要使用boost裡的多執行緒庫,所以遇到了下面的坑。 系統版本:ubuntu18.04 一,安裝boost 1,去boost官網下載 boost_1_XX_0.tar.gz 2,解壓 tar -zxvf boost_1_65_0.tar.gz 3

c/c++ 執行 boost的讀寫(reader-writer)鎖

多執行緒 boost的讀寫(reader-writer)鎖 背景:保護很少更新的資料結構時,c++標準庫沒有提供相應的功能。 例如:有個DNS條目快取的map,基本上很少有更新,大部分都是讀取,但是偶爾也會有更新,這種情況下,如果在讀取的函式里加上std::mutex就過於悲觀了,每次只能有一個執行緒讀取

Boost ptree 解析json字串 執行下程式crash

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

boost執行(Thread)程式設計(執行操作,互斥體mutex,條件變數)

轉載地址: 1 建立執行緒 就像std::fstream類就代表一個檔案一樣,boost::thread類就代表一個可執行的執行緒。預設建構函式建立一個代表當前執行執行緒的例項。一個過載的建構函式以一個不需任何引數的函式物件作為引數,並且沒有返回值。這個建構函式建立

非同步服務端中的執行 boost asio

這個demo程式好像會死鎖,哪位高手要是能找到原因麻煩告訴一下 // gogogo.cpp : Defines the entry point for the console application. // #include "stdafx.h" #ifdef WIN3

Boostboost庫中thread執行詳解5——談談執行中斷

執行緒不是在任意時刻都可以被中斷的。如果將執行緒中函式中的sleep()睡眠等待去掉,那麼即使在主執行緒中呼叫interrupt()執行緒也不會被中斷。 thread庫預定義了若干個執行緒的中斷點,只有當執行緒執行到中斷點的時候才能被中斷,一個執行緒可以擁有任意多箇中斷點。

(十二)boost庫之執行高階特性

很多時候,執行緒不僅僅是執行一些耗時操作,可能我們還需要得到執行緒的返回值,一般的處理方法就是定義一個全域性狀態變數,不斷輪訓狀態,就如我目前維護的一個專案,全域性變數定義了N中狀態,看的讓人抓狂。該專案的大體邏輯是這樣的,啟動K個執行緒,當執行緒執行到某一個點時,進行輪

Boostboost庫中thread執行詳解3——細說lock_guard

boost::lock_guard可以說是一種比boost::unique_lock輕量級的lock, 簡單一些場景可以用它就行了。 看看它的原始碼也很簡單:template<typename Mutex> class lock_guard { private:

Boostboost庫中thread執行詳解1

1. 概述 執行緒就是,在同一程式同一時間內允許執行不同函式的離散處理佇列。 這使得一個長時間去進行某種特殊運算的函式在執行時不阻礙其他的函式變得十分重要。 執行緒實際上允許同時執行兩種函式,而這兩個函式不必相互等待。 一旦一個應用程式啟動,它僅包含一個預設執行緒。 此執行