1. 程式人生 > >Boost Asio 中的執行緒和基本原理

Boost Asio 中的執行緒和基本原理

說到Boost.Asio的執行緒時,我們經常在討論:

  •  io_service:io_service是執行緒安全的幾個執行緒可以同時呼叫io_service::run()。大多數情況下你可能在一個單執行緒函式中呼叫io_service::run(),這個函式必須等待所有非同步操作完成之後才能繼續執行。然而,事實上你可以在多個執行緒中呼叫io_service::run()。這會阻塞所有呼叫io_service::run()的執行緒。只要當中任何一個執行緒呼叫了io_service::run(),所有的回撥都會同時被呼叫;這也就意味著,當你在一個執行緒中呼叫io_service::run()時,所有的回撥都被呼叫了。
  • socket:socket類不是執行緒安全的。所以,你要避免在某個執行緒裡讀一個socket時,同時在另外一個執行緒裡面對其進行寫入操作。(通常來說這種操作都是不推薦的,更別說Boost.Asio)。
  • utility:就utility來說,因為它不是執行緒安全的,所以通常也不提倡在多個執行緒裡面同時使用。裡面的方法經常只是在很短的時間裡面使用一下,然後就釋放了。

注意:如果沒有其他需要監控的操作,service.run()就會結束,就像下面的程式碼片段:

io_service service;
tcp::socket sock(service);
sock.async_connect( ep, connect_handler);
service.run();
在上面的例子中,只要sock建立了一個連線,connect_handler就會被呼叫,然後接著service.run()就會完成執行。


如果你想要service.run()接著執行,你需要分配更多的工作給它。

這裡有兩個方式來完成這個目標。一種方式是在connect_handler中啟動另外一個非同步操作來分配更多的工作。 另一種方式會模擬一些工作給它,用下面的程式碼片段:

typedef boost::shared_ptr work_ptr;
work_ptr dummy_work(new io_service::work(service));

上面的程式碼可以保證service.run()一直執行直到你呼叫useservice.stop()或者 dummy_work.reset(0);// 銷燬dummy_work.

相關推薦

Boost Asio 執行基本原理

說到Boost.Asio的執行緒時,我們經常在討論:  io_service:io_service是執行緒安全的。幾個執行緒可以同時呼叫io_service::run()。大多數情況下你可能在一個單執行緒函式中呼叫io_service::run(),這個函式必須等待所有非

Java執行基本api及其作用

1.執行緒池相關的類 2.重要類的api及其方法 Executors.newCachedThreadPool() 建立一個可快取的執行緒池 Executors.newSingleThreadExecutor();建立一個只有一個執行緒執行的 不可修改的執行緒池  

Java執行池ThreadPoolExecutor原理探究

一、 前言 執行緒池主要解決兩個問題:一方面當執行大量非同步任務時候執行緒池能夠提供較好的效能,,這是因為使用執行緒池可以使每個任務的呼叫開銷減少(因為執行緒池執行緒是可以複用的)。另一方面執行緒池提供了一種資源限制和管理的手段,比如當執行一系列任務時候對執行緒的管理,每個ThreadPool

BOOST::ASIO執行下socket關閉導致程序崩潰問題定位及解決

boost::threadpool::detail::worker_thread<boost::threadpool::detail::pool_core<boost::function0<void>, boost::threadpool::fifo_scheduler, boost:

boost asio執行同步伺服器

#include<iostream> #include<stdlib.h> #include<boost\asio.hpp> #include<boost\th

iOS執行基本介紹(OC)

一:pthread:基於C 二:NSThread:基於OC 三:GCD:基於C 四:NSOperation:對GCD面向物件的包裝 (一):GCD基本操作:六種任務執行模式 - (void)touchesBegan:(NSSet<UI

Java併發包執行池ThreadPoolExecutor原理探究

一、執行緒池簡介   執行緒池的使用主要是解決兩個問題:①當執行大量非同步任務的時候執行緒池能夠提供更好的效能,在不使用執行緒池時候,每當需要執行非同步任務的時候直接new一個執行緒來執行的話,執行緒的建立和銷燬都是需要開銷的。而執行緒池中的執行緒是可複用的,不需要每次執行非同步任務的時候重新建立和銷燬執行

boostasio網路庫多執行併發處理實現,以及asio在多執行模型執行的排程情況執行安全。

1、實現多執行緒方法: 其實就是多個執行緒同時呼叫io_service::run         for (int i = 0; i != m_nThreads; ++i)         {             boost::shared_ptr<boost::

深入分析JVM執行的建立執行原理 (future)

在JVM中除了應用執行緒,還有其他的一些執行緒用於支援JVM的執行,這些執行緒可以被劃分為以下幾類: VM Thread:負責JVM在安全點內的各種操作,這些操作(諸如自動記憶體管理、取消偏向鎖、執行緒dump、執行緒掛起等等)在執行過程中需要JVM處於這樣一個狀態——堆的內容不會被改變,這種狀態在

Boost.Asio執行

io_service:io_service是執行緒安全的。幾個執行緒可以同時呼叫io_service::run()。大多數情況下你可能在一個單執行緒函式中呼叫io_service::run(),這個函

Oracle 11G R2 RAC的scan ip 的用途基本原理【轉】

partition lease 重試 方便 documents 簡單的 scrip html reserve Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client鏈接數據庫的時候要用vip,假如你的cluster有4個節點,那麽客戶端的t

程序、執行執行基本概念

程序、執行緒和多執行緒基本概念 一、概念 1、程序(process) 狹義定義:程序就是一段程式的執行過程。 廣義定義:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。

Java 多執行分段下載原理分析實現

多執行緒下載介紹   多執行緒下載技術是很常見的一種下載方案,這種方式充分利用了多執行緒的優勢,在同一時間段內通過多個執行緒發起下載請求,將需要下載的資料分割成多個部分,每一個執行緒只負責下載其中一個部分,然後將下載後的資料組裝成完整的資料檔案,這樣便大大加快了下載效率。常見的下載器,迅

java執行安全執行安全的集合

  執行緒安全 非執行緒安全 Collection Vector ArrayList、LinkedList   H

一位10年Java程式設計師總結進階的你懂多執行jvm優化嗎?

感謝朋友們的認可和指正。本文是有感而發,因為看過了太多坑人的部落格和書籍,感慨自己走過的彎路,不希望其他初學者被網上互相抄襲的部落格和東拼西湊的書籍浪費時間,想以一個相對巨集觀的視野來描述一個概念,力求通俗易懂,所以沒有深入太多細節,簡化了很多模型,給部分朋友造成了疑惑,說聲抱歉。也沒有配圖,都是抽

Qt通過訊號槽在子執行執行進行資料傳遞

QT中兩個執行緒之間進行自定義型別資料傳遞 兩個執行緒中進行資料傳遞時,傳遞的資料放到佇列中(queue),所以在這個過程中,需要在傳遞前將資料拷貝、儲存到佇列中;為了儲存這些引數,Qt需要construct、destruct、copy這些物件,為了讓Qt知道

執行池實現原理(Executor框架),java提供常用的幾種執行池、死鎖產生條件避免

 為什麼使用執行緒池 伺服器應用程式中經常出現的情況是:單個任務處理的時間很短而請求的數目卻是巨大的。如果每個請求對應一個執行緒(thread-per-request)方法的不足之一是:為每個請求建立一個新執行緒的開銷很大;為每個請求建立新執行緒的伺服器在建立和銷燬執行緒上

執行基本結構原理

ThreadPoolExecutor執行緒池頂級父類Executor interface Executor extends interface ExecutorService imp

JavaSE基礎(day19)(1)I/O流(2)執行基本概念基本操作(3)執行的同步機制

默寫: 1.程式設計題 使用三種方式實現檔案的拷貝。 程式碼 (1)I/O流 (2)執行緒的基本概念和基本操作 (3)執行緒的同步機制 1.I/O流 1.1 ObjectOutputStream類(重點) (1)基本概念 java.io.ObjectOutputStream類用於

Python執行、多執行多程序的效率對比實驗

Python是執行在直譯器中的語言,查詢資料知道,python中有一個全域性鎖(GIL),在使用多程序(Thread)的情況下,不能發揮多核的優勢。而使用多程序(Multiprocess),則可以發揮多核的優勢真正地提高效率。 對比實驗 資料顯示,如果多執行緒的程序是CPU密集型的,那多執行緒並不能有多少