1. 程式人生 > >關於 boost 多執行緒(一)

關於 boost 多執行緒(一)

關於 boost 多執行緒(一)

在純 C++ 開發中,執行緒的建立由 pthread_create 函式實現。成功返回0,出錯返回 -1.其函式原型為:

int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*start_rtn)(void*),void *arg);

呼叫該函式時需要傳入一個函式地址作為形參,該地址即為執行緒執行的入口。從建立的過程中可以看到,建立的同時綁定了執行緒任務(指定函式入口地址)。接下來只要 run 起來就可以了。對於多執行緒來說,boost 中有專門用來管理多個執行緒的 thread_group 類,它的作用相當於執行緒池。在 thread_group 的內部機制中,用 std::list <thread *>

來實現多個執行緒的管理。檢視boost庫發現,thread_group 類的定義:

class thread_group
    {
    private:
        thread_group(thread_group const&);
        thread_group& operator=(thread_group const&);
    public:
        thread_group() {}
        ~thread_group()
        {
            for(std::list<thread*>
::iterator it=threads.begin(),end=threads.end(); it!=end; ++it) { delete *it; } } bool is_this_thread_in() { thread::id id = this_thread::get_id(); boost::shared_lock<shared_mutex>
guard(m); for(std::list<thread*>::iterator it=threads.begin(),end=threads.end(); it!=end; ++it) { if ((*it)->get_id() == id) return true; } return false; } bool is_thread_in(thread* thrd) { if(thrd) { thread::id id = thrd->get_id(); boost::shared_lock<shared_mutex> guard(m); for(std::list<thread*>::iterator it=threads.begin(),end=threads.end(); it!=end; ++it) { if ((*it)->get_id() == id) return true; } return false; } else { return false; } } template<typename F> thread* create_thread(F threadfunc) { boost::lock_guard<shared_mutex> guard(m); std::auto_ptr<thread> new_thread(new thread(threadfunc)); threads.push_back(new_thread.get()); return new_thread.release(); } void add_thread(thread* thrd) { if(thrd) { BOOST_THREAD_ASSERT_PRECONDITION( ! is_thread_in(thrd) , thread_resource_error(system::errc::resource_deadlock_would_occur, "boost::thread_group: trying to add a duplicated thread") ); boost::lock_guard<shared_mutex> guard(m); threads.push_back(thrd); } } void remove_thread(thread* thrd) { boost::lock_guard<shared_mutex> guard(m); std::list<thread*>::iterator const it=std::find(threads.begin(),threads.end(),thrd); if(it!=threads.end()) { threads.erase(it); } } void join_all() { BOOST_THREAD_ASSERT_PRECONDITION( ! is_this_thread_in() , thread_resource_error(system::errc::resource_deadlock_would_occur, "boost::thread_group: trying joining itself") ); boost::shared_lock<shared_mutex> guard(m); for(std::list<thread*>::iterator it=threads.begin(),end=threads.end(); it!=end; ++it) { if ((*it)->joinable()) (*it)->join(); } } #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS void interrupt_all() { boost::shared_lock<shared_mutex> guard(m); for(std::list<thread*>::iterator it=threads.begin(),end=threads.end(); it!=end; ++it) { (*it)->interrupt(); } } #endif size_t size() const { boost::shared_lock<shared_mutex> guard(m); return threads.size(); } private: std::list<thread*> threads; mutable shared_mutex m; };

其建立過程與一般執行緒建立過程類似,由create_thread 函式實現:

for (std::size_t i = 0; i < thread_pool_size_; ++i) {
    thread_group_.create_thread(boost::bind(
                 &boost::asio::io_service::run, &io_service_));
}   

這裡將建立的每個執行緒都繫結在了 boost::asio::io_service io_service_ 上,並在建立成功後讓執行緒執行起來。用這種方式實現的多執行緒,必須先給予執行緒任務。否則,會導致執行緒空 run ,然後自動退出,只剩下主執行緒。(如果只是繫結函式,與 pthread_create 方式一致)。

gSystemUtil.m_download =  new CRemoteDownLoadClient (gSystemUtil.get_io_service(), Name, IP_Address, Port, Local_Dir_Path, Header);
gSystemUtil.m_download->Start(Start_Num, Nums);

上述這段程式碼相當於把繫結執行緒的 io_service_ 給了 CRemoteDownLoadClient 使用,把它貼上線上程池建立後,用這來驗證執行緒是否會退出。編譯後執行程式,用 ps 命令檢視應用程序的pid,然後用 top -H -p pid 監測該程序:
這裡寫圖片描述
可以看到,只有pid為31948的主執行緒在執行。如果是正常執行的多執行緒程式,應該可以看到多個執行緒資訊:
這裡寫圖片描述
如果想要用 thread_group 先創好執行緒,並在需要時再給予任務,可以使用 boost 中的boost::asio::io_service::work.在建立前人為給執行緒一個 work,這樣執行緒就不會空 run.至於執行緒在work時的資源佔用和損耗,一般可不計。

相關推薦

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

boost執行程式設計()

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

執行():建立執行的幾種方法

概括來說就是兩種:1、繼承Thread類,重寫run方法,然後start。不推薦這種,因為java的單繼承特性。 2、Thread類的建構函式中可以接受Runnable任務,所以只要是Runnable例項就可以作為引數給Thread 一般有兩種建立Runnable例項的方法(1)實現Runn

Java執行()執行基礎

1.執行緒與程序 程序: 是併發執行的程式在執行過程中分配和管理資源的基本單位,是一個動態概念,程序是系統中獨立存在的實體,擁有自己獨立的資源,擁有自己私有的地址空間。程序的實質,就是程式在多道程式系統中的一次執行過程,它是動態產生,動態消亡的,具有自己的生命週

java基礎(二十八)執行

【概念】 程序: 正在執行的程式叫做程序。比如,我開了一個QQ,那麼QQ在記憶體中就佔了一塊記憶體。 執行緒: 程序是不直接執行的,執行程式由執行緒來執行。程序只是負責分配記憶體控制元件。執行緒是執行路徑(控制單元)。 一個程序中可以多執行路徑,稱之為多執行緒 一個程序

JAVA執行()

要想了解多執行緒,首先需要了解一下多執行緒的基礎知識,如多執行緒生命週期 多執行緒的週期大體上分為五個,NEW,RUNNABLE,RUNNING,BLOCKED,TERMINATED. 在這裡我們首先,先想一個問題,是否執行緒.start之後,該執行緒就執行了呢?

java執行基礎方面的總結-執行()

1:  同學,解釋一下什麼是執行緒,什麼是程序,我們為什麼要使用多執行緒   我的理解就是程序就是一段可執行的程式,而線相當於執行這段程式中一個可執行的單元     接下來我們從兩個方面解釋為什麼要使用多執行緒減少響應得到時間,我們如果使用單執行緒的話,例如某個操作很耗時間,

JAVA執行————篇文章讓你徹底征服執行開發()

多執行緒的基本概念 執行緒指程序中的一個執行場景,也就是執行流程,那麼程序和執行緒有什麼區別呢? 每個程序是一個應用程式,都有獨立的記憶體空間 同一個程序中的執行緒共享其程序中的記憶體和資源(共享的記憶體是堆記憶體和方法區記憶體,棧記憶體不共享,

JAVA執行————篇文章讓你徹底征服執行開發

多執行緒的基本概念執行緒指程序中的一個執行場景,也就是執行流程,那麼程序和執行緒有什麼區別呢?每個程序是一個應用程式,都有獨立的記憶體空間同一個程序中的執行緒共享其程序中的記憶體和資源(共享的記憶體是堆記憶體和方法區記憶體,棧記憶體不共享,每個執行緒有自己的。)什麼是程序?一

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

執行()執行建立的三種方式

建立執行緒的三種方式: 1.第一種方式繼承Thread類,重寫Thread類中的run方法,還需要呼叫start方法,start方法相當於通知CPU,執行緒已經就緒,CPU在合適的時間點呼叫該執行緒的run方法;我們程式中的main方法,我們稱之為主執行緒。 2.建立執行緒的第二種方式,實現Runnabl

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

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

Android執行()執行

1.  new Thread  new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub

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

java執行 基本實現方法、消費者生產者佇列、死鎖

1.基本概念圖 四個狀態、start 代表被建立、run表示正在執行、阻塞(在幹別的事情去了,可以把資源空出來給別人用)、死亡。 核心思想是提高cpu的使用率,你幹別的事去了我來利用cpu啊,難點是同步,同時訪問資料,一個廁所只有一個坑,倆個人一起上是不

boost執行之scoped_lock理解

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