在前面的多工執行裡,因為有多個執行緒執行,只要放到任務佇列裡的任務都會執行,但這些任務執行順序是隨機的,沒有固定的順序,也就是說放入佇列早的任務不一定就是早執行,放入佇列遲的任務也不一定後執行。這樣沒有順序的執行性是多執行緒的本來特性,雖然可以使用鎖物件來同步乙個物件不被多個執行緒同時訪問,但它是沒有辦法確保任務之間的有序訪問同乙個資源。這時,就需要引入乙個物件
io_service::strand
,有它來保證放入任務佇列的任務,可以按它放入任務佇列的順序來執行。比如使用乙個執行緒池來執行寫多個檔案,每乙個檔案都是有序的資料,而多個檔案之間是無序的,這樣在每乙個檔案都使用
io_service::strand
放入,而多個
io_service::strand
物件之間是無序的,這樣確保每乙個檔案寫是有序佇列,而多個檔案可以無序執行,達到最大效能地使用
cpu資源。如下面的例子:
//#include "stdafx.h"
#include #include #include #include #include void taskrun(int nval)
//封裝執行緒組執行的類, 並且演示使用類成員函式作為執行緒組執行函式
class cthreadbase
void start(int nmaxcount) }
void stop(void)
//測試任務佇列
//軟體開發人員: 蔡軍生 2013-04-28
void testtask(void)
//測試有序任務佇列
void teststrandtask(void)
private:
virtual void run(int nval)
private:
//定義乙個任務佇列。
boost::asio::io_service m_ioservice;
boost::asio::io_service::work m_work;
//定義乙個執行緒組物件。
boost::thread_group m_threadgroup;
//按順序執行的物件。
boost::asio::io_service::strand m_strand;
};int _tmain(int argc, _tchar* argv)
這是執行上面例子執行的結果:
taskrun: 2
taskrun: 4
taskrun: 3
taskrun: 1
taskrun: 5
taskrun: 6
teststrandtask:
taskrun: 1
taskrun: 2
taskrun: 3
taskrun: 4
taskrun: 5
taskrun: 6
請按任意鍵繼續. . .
從這個結果可以看到第一部份是無序執行的輸出,最後一部份是有序執行。
boost庫在工作(21)任務之一
boost 庫里提供了乙個強大的任務佇列,這個佇列可以使用執行緒池訪問,也可以當任務為空時阻塞執行緒。使用這個任務佇列,可以讓多個任務動態執行,以及適應不同的情況,可以得心應手。在 windows 系統上實現是採用 iocp 的原理來實現,因此這個任務佇列不但可以執行一般的任務,也適用於網路應用方面...
boost庫在工作(22)任務之二
往往我們開發出來的產品,都是執行在不同的國家,不同的地區,不同生活水平的使用者,因而軟體產品會執行在不同的環境的電腦裡。比如富裕國家裡的電腦硬體資源,都比較好,如果還是按低配置電腦的水平設計,顯示不會滿足使用者的要求。但是按高配置要求的硬體資源來設計,行嗎?也不行,比如軟體安裝到工廠這樣節約資源的電...
boost庫在工作(24)任務之四
在軟體開發裡,經常會遇到這樣的情況,比如客戶讓我們開發的軟體要求每隔半小時,就要備份一次資料,以便避免資料丟失。又比如在開發乙個遊戲網路伺服器時,需要不斷檢查客戶端連線上來的資料連線是否還有效,這時也需要使用乙個任務來檢查客戶端的連線是否還有心跳包過來,如果沒有心跳包,就可以把這個連線斷開,釋放相關...