Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 43

0
votes
answers
26 views
+10

C++ //將Boost :: array傳遞給Boost ::線程

0

我想將「boost :: array」傳遞給「booth :: thread」作業。C++ //將Boost :: array傳遞給Boost ::線程

typedef unsigned char BYTE; 
boost::array<BYTE,256> readBuffer; 
thread gojob(&thread_job, readBuffer.data()); 

如何通過它?

void serial::thread_job(BYTE *received) { 

} 

我寫了這..但編譯給我奇怪的消息僅.. 我不明白他在說....

include/boost/bind/mem_fn.hpp:333:36: error: cannot apply member pointer ‘((const boost::_mfi::dm<void(unsigned char*), serial>*)this)->boost::_mfi::dm<void(unsigned char*), serial>::f_’ to ‘* boost::get_pointer<unsigned char>(((unsigned char*)u))’, which is of non-class type ‘unsigned char’ 
+0

[貌似'的boost ::數組::數據()''是const',一件事(http://www.boost.org/ DOC /庫/ 1_60_0/DOC/HTML /升壓/ array.html#idm45507153295488-BB)。所以你試着將'unsigned char const *'傳遞給一個期待'unsigned char *'的函數。通過一個複雜的圖書館,它可以給我們一些奇怪的錯誤,我猜。 – BoBTFish

沙发
0
0

傳遞緩衝區,然後對數據進行工作(),你可以這樣做:

thread gojob(boost::bind(&serial::thread_job,this, boost::ref(readBuffer)) 
+0

我改變這樣的代碼:next error message is「include/boost/bind/mem_fn.hpp:333:36:error:no matching function for call to'get_pointer(const boost :: array &) '「工作功能沒問題? void serial:thread_job(BYTE * received) –

+0

不是,'serial :: thread_job(BYTE * received)'現在變成'serial :: thread_job(boost :: array&received)' –

+0

謝謝。但是我的能力不能寫入下一行...... :(void serial :: thread_job(boost :: array&received){*}如何使用/轉換爲Original boost :: array ?? */ BYTE Command = *(received + 2);? –

0
votes
answers
32 views
+10

未定義的升壓參考

0

我試圖鏈接使用Boost的第三方庫。我已經鏈接到正確的提升庫(libboost_program_options.a),但仍未找到它。未定義的升壓參考

誤差MSG(格式化的位爲清楚起見):

undefined reference to `boost::program_options::validate(boost::any&, 
           std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, 
           std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, 
           int)' 

納米--demangle libboost_program_options.a | grep validate

boost::program_options::validate(boost::any&,         std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, 
            bool*, 
            int) 
boost::program_options::validate(boost::any&, 
            std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, 
            std::string*, 
            int) 
boost::program_options::validate(boost::any&, 
            std::vector<std::string, std::allocator<std::string> > const&, 
            bool*, 
            int) 
boost::program_options::validate(boost::any&, 
            std::vector<std::string, std::allocator<std::string> > const&, 
            std::string*, 
            int) 

第二條記錄看起來很相似,但顯然不夠接近。任何想法如何編譯Boost來獲得與庫中的內容相匹配的簽名?我向圖書館的所有者請求瞭解他們正在使用的Boost版本等,但還沒有收到回覆。

這是一個CentOS 7盒子,它使用g ++版本4.8.5。但我嘗試鏈接的庫大量使用C++ 11,並使用g ++ v 6.1編譯,所以我安裝了devtoolset-6,它給了我一個g ++ 6環境(g ++版本6.3.1)

我下載了並從頭開始構建Boost(v1.65.1),以便使用相同的編譯器構建而不是系統版本。

編輯... 我認爲約翰Zwinck是在正確的軌道上,但我無法得到增強庫編譯到新的ABI。

的驗證()函數在value_semantic.cpp

剝離構建下的基本知識發現,並添加標誌討論:

g++ -std=c++11 -D_GLIBCXX_USE_CXX11_ABI -c -o test.o libs/program_options/src/value_semantic.cpp 

nm --demangle test.o | grep validate 
00000000000008b6 T boost::program_options::validate(boost::any&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, bool*, int) 
0000000000000c02 T boost::program_options::validate(boost::any&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, std::string*, int) 
00000000000005f2 T boost::program_options::validate(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, bool*, int) 
0000000000000b9a T boost::program_options::validate(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, std::string*, int) 

是否_GLIBCXX_USE_CXX11_ABI宏只適用於GCC 5.1的工作?

+1

您是否嘗試過使用'g ++ -std = C++ 11'來構建boost? – burlyearly

+0

不 - 據我所知,C++ 11是g ++ v6的默認設置。不過,我正在考慮這個問題 - 必須看看如何將它融入Boost構建系統。 – CoAstroGeek

+1

剛剛看過C++ 14是gcc v6的默認版本 https://gcc.gnu.org/projects/cxx-status.html#cxx11 – CoAstroGeek

沙发
0
0

您似乎在C++ 11觸犯GCC雙ABI的運行std::stringhttps://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

你的程序正試圖使用??

std::__cxx11::basic_string<char>* 

對一個API來的鏈接,但您的Boost庫有

std::basic_string<char>* 

這意味着您的Boost庫是使用GCC超過5.1版本構建的,或者關閉了新的ABI。在這兩種情況下,你可以自己編譯的代碼與新的ABI關閉加入這個編譯標誌:

-D_GLIBCXX_USE_CXX11_ABI=0 

通過與編譯程序時,將有可能使用系統提供的(舊ABI)提升圖書館。但問題是你的供應商將哪些C++ ABI編譯成代碼(詢問他們,或者在他們的庫中查找__cxx11)。

+0

我認爲這是正確的軌道,但我仍然無法讓我的構建與第三方庫ABI匹配 - 請參閱上面的編輯。謝謝! – CoAstroGeek

板凳
0
0

好的,我想我已經知道爲什麼我不能讓g ++生成cxx11簽名(新的ABI)。

如果我運行克++帶-v選項:

g++ -v 
Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/lto-wrapper 
Target: x86_64-redhat-linux 
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-6/root/usr --mandir=/opt/rh/devtoolset-6/root/usr/share/man --infodir=/opt/rh/devtoolset-6/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-plugin --with-linker-hash-style=gnu --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl=/builddir/build/BUILD/gcc-6.3.1-20170216/obj-x86_64-redhat-linux/isl-install --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux 
Thread model: posix 
gcc version 6.3.1 20170216 (Red Hat 6.3.1-3) (GCC) 

注下 「被配置爲」 字段的下面

--with - 缺省 - libstdcxx-ABI = GCC4兼容

我相信這意味着g ++的devtoolset-6版本是使用舊式ABI「烘烤」構建的,因此它不會響應_GLIBCXX_USE_CXX11_ABI宏。

根據此鏈接:https://gcc.gnu.org/onlinedocs/libstdc++/manual/configure.html

--with-默認libstdcxx-ABI = OPTION 設置爲_GLIBCXX_USE_CXX11_ABI宏(見宏)的默認值。默認值爲OPTION = new,將宏設置爲1,使用OPTION = gcc4-compatible將其設置爲0.此選項不會更改庫ABI。

它似乎只改變_GLIBCXX_USE_CXX11_ABI的默認值,但在我的嘗試設置_GLIBCXX_USE_CXX11_ABI沒有任何影響。

這不是正面的,但它是我現在的工作理論。任何額外的洞察力是讚賞。

0
votes
answers
38 views
+10

如何睡覺一個C++ Boost線程

34

似乎不可能睡覺使用boost :: thread的線程。 方法睡眠需要system_time,但我該如何構建它?如何睡覺一個C++ Boost線程

尋找內庫並不能真正幫助很大......

基本上我有我傳遞給這個線程作爲入口點函數中的一個線程 ,我想打電話給像

boost::this_thread::sleep 

什麼的,該怎麼做?

謝謝

沙发
0
83

根據您的Boost版本:

要麼...

#include <boost/chrono.hpp> 
#include <boost/thread/thread.hpp> 

boost::this_thread::sleep_for(boost::chrono::milliseconds(100)); 

或者......

#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/thread/thread.hpp> 

boost::this_thread::sleep(boost::posix_time::milliseconds(100)); 

您還可以使用微秒,秒,幾分鐘,幾小時,也許還有一些,我不確定。

+2

是的,謝謝你...我沒有注意使用this_thread,但只是提升::線程和沒有工作:) Thansk – Andry 2010-11-24 13:37:47

+2

這給了我以下錯誤(使用Xcode 5/LLVM):錯誤:沒有可行的轉換從'boost :: posix_time :: microseconds'(又名'subsecond_duration ')到'const system_time'(又名'const boost :: posix_time :: ptime') – 2014-01-31 11:38:15

板凳
0
3

首先

boost::posix_time::seconds secTime(1); 
boost::this_thread::sleep(secTime); 

其次

boost::this_thread::sleep(boost::posix_time::milliseconds(100)); 
地板
0
19

從另一篇文章,我學到boost::this_thread::sleep已經廢棄了升壓V1.5.3:http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html

相反,嘗試

void sleep_for(const chrono::duration<Rep, Period>& rel_time); 

例如

boost::this_thread::sleep_for(boost::chrono::seconds(60)); 

也許嘗試

void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); 

我使用升壓V1.53與過時sleep功能,並不定期地崩潰的程序。當我將sleep函數的調用更改爲調用sleep_for函數時,程序停止崩潰。

4楼
0
0

我學到了艱辛的道路,至少在MS Visual Studio中(試過2013年和2015年)有

boost::this_thread::sleep(boost::posix_time::microseconds(SmallIterval)); 

boost::this_thread::sleep_for(boost::chrono::microseconds(SmallIterval)); 
or 
std::this_thread::sleep_for(std::chrono::microseconds(SmallIterval)); 

當間隔小於一些比較小的之間的巨大差異實質性的門檻(我看到15000微秒的閾值= 15毫秒)。

如果SmallIterval很小,sleep()會立即中斷。睡眠(100 mks)表現爲睡眠(0 mks)。

但是,小於閾值的時間間隔的sleep_for()在整個閾值內暫停。 sleep_for(100 mks)表現爲sleep_for(15000 mks)。

間隔大於閾值和值爲0的行爲是相同的。

0
votes
answers
35 views
+10

鏈接boost ::線程

3

我試圖學習與boost庫的東西,但當我嘗試編譯包含boost :: threads的東西時遇到問題。 我鏈接過程中得到一個錯誤,這就是消息:鏈接boost ::線程

/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lboost-thread 

但它的奇怪,因爲這種情況,只有當我與一個普通用戶編寫,使用根我也沒有問題編譯。

在此先感謝。

+1

你跑的命令是什麼?通常你必須在那裏提供'-L [/ path/to/boost]',所以它知道在哪裏找到它。 – 2012-03-05 20:57:26

+0

最近版本的boost需要使用「-lboost_thread」 – dsign 2012-03-05 21:19:28

+0

這是我運行的命令: g ++ -L/usr/local/boost_1_48_0/stage/lib -lboost-thread threadBoost.cpp,但它只能用於根目錄 – alkz 2012-03-05 23:12:32

沙发
0
1

檢查的lib名提升安裝路徑(默認是:/ usr/lib中/),如果是libboost_thread.so,加-lboost_thread。不要忘記用-L/usr/lib/boost指定升級目錄的路徑。 如果只是上班根,請檢查您的權限在此目錄中:

ls -la /usr/lib/ | grep boost 

你應該看到您的登錄,並rw_r_ [R _(檢查是否具有讀取權限)。

如果您對目錄和升壓LIB此權限,用gcc鏈接可以做到:

g++ obj.o obj2.o -L/usr/lib -lboost_thread 

,如果你沒有自己的文件或沒有讀取權限,以root身份登錄並將它們添加

chown -R /usr/lib <your login> 
chmod +r /usr/lib/lib*.so 
+1

我已經檢查的權限,但也有0K(777),我編譯如下: G ++ -L在/ usr /本地/ boost_1_48_0 /臺/ lib目錄-lboost線程threadBoost.cpp 但我仍然得到: 找不到 - LBOOST線程 – alkz 2012-03-06 12:28:20

板凳
0
0

添加/ path/to/boost到您的makefile庫包含路徑並且您的錯誤將消失。

另一種選擇是包括提升到您的LIBPATH變量

地板
0
5

包括

#include <boost/thread/thread.hpp> 

其它鏈接器標記

-lboost_system -lboost_thread-mt 
0
votes
answers
18 views
+10

C++提升線程重用線程

2

我試圖完成這樣的事情:C++提升線程重用線程

thread t; // create/initialize thread 
t.launch(); // launch thread. 
t.wait(); // wait 
t.launch(); // relaunch the same thread 

如何去實現這樣的使用boost線程?本質上,我需要持久的可重新啓動的線程。

我想,以避免工作隊列,因爲在我的情況下實現有一定的困難

感謝

沙发
0
4

你只想讓線程運行在一個循環。它試圖從隊列中取出一部分「工作」,執行工作,然後返回隊列。當隊列爲空時,它等待。

然後從另一個線程中,您可以插入工作項到隊列中,以便線程執行它們。

再次讀你的問題,你是說你想讓你的主線程通知工作線程開始工作,但主線程必須立即開始等待工作完成?這意味着一次只能運行一個線程。這是沒有意義的。線程是爲併發執行而設計的。

假設這不是你想要的,那麼我想知道什麼比簡單的工作線程跑出隊列更簡單。線程正在工作或等待。因此,您需要一些允許主人和工人之間進行通信的數據結構,以便工作人員可以等待工作物件到達,並且主人可以發送工作物件,以喚醒工作人員,然後在工作物件完成時,工人等待另一個。

+0

這是另一種選擇。 但是在我的情況下,工作隊列有點複雜。如果我有主線程分配工作(這是我正在嘗試做的),它會簡單得多 – Anycorn 2010-04-17 16:25:06

+0

@aaa - 請參閱update;除非你完全擺脫線程,否則我看不出如何做比這更簡單的事情。 – 2010-04-17 16:35:53

+0

工作結構是一個帶有奇怪邊界的嵌套循環,並非所有線程都可以處理所有工作。然而,我確實設法實施了積壓的平面任務隊列。這可能是更可擴展的方法 – Anycorn 2010-04-18 01:34:56

0
votes
answers
22 views
+10

boost :: thread:如何啓動所有線程,但一次只能運行n個?

3

boost::thread庫中,是否有任何機制來控制同時運行多少個線程(最多)?boost :: thread:如何啓動所有線程,但一次只能運行n個?

在我而言,這將是最方便的開始N線程都在同一時間(N可以是幾百或幾千個):

std::vector<boost::thread*> vec; 
for (int i = 0; i < N; ++i) { 
    vec.push_back(new boost::thread(my_fct)); 
} 
// all are running, now wait for them to finish: 
for (int i = 0; i < N; ++i) { 
    vec[i]->join(); 
    delete vec[i]; 
} 

但我想推動一個最大的透明設置比如說,一次運行4個線程。 (我共享一個8核心機器,所以我不應該一次運行超過4個)。

當然,我可以照顧每次只能啓動4個,但是解決方案我問的問題會更透明,最方便。

沙发
0
3

不要以爲Boost.Thread內置了這個功能,但是你可以將Boost.Threadpool(而不是官方庫)覆蓋到Boost.Thread上,並且允許你通過SizePolicy控制線程數。

默認值是fixed-size pool這就是你想要的 - 指定threadpool構造函數的初始(和正在進行的)線程數。

板凳
0
3

你真正想要的東西,似乎只會有4個線程,每個線程會處理很多作業

實現此目的的一種方法是根據需要產生儘可能多的線程,然後爲每個線程的運行循環從存儲線程安全的隊列結構中獲取任務(通常是函數對象或指針)一切需要完成的事情。

這樣可以避免創建大量線程的開銷,並且仍然保持相同的併發量。

地板
0
1

您可以創建一個鎖,您只能獲得n次。然後每個線程在處理之前都必須獲取鎖(阻塞)。

0
votes
answers
26 views
+10

boost :: asio內部線程

3

當使用boost :: asio進行一些異步TCP通信時,我注意到它啓動了很多(3-4)內部線程。在the documentation閱讀,它說boost :: asio內部線程

"The implementation of this library for a particular platform may 
make use of one or more internal threads to emulate asynchronicity" 

現在我的lib有着嚴格的要求,以不啓動任何額外的線程(除了由客戶提供的,現在它也開始io_service::run()一個)。有沒有什麼辦法可以停止boost :: asio來創建這些額外的線程?

另外,是否有任何其他的異步庫,只能在一個線程中運行?

沙发
0
5

您可以通過在相應的轉換單位中定義BOOST_ASIO_DISABLE_THREADS來禁用仿真的異步操作支持。 The documentation有這樣說的定義

Explicitly disables Boost.Asio's threading support, independent of whether or not Boost as a whole supports threads.

如果你沒有找到platform specific implementation notes,它明確指出哪些操作使用該仿真。例如我幾乎在每個平臺上都知道async_resolve()是以這種方式模擬的,線程是在第一次調用async_resolve()時創建的。一些(所有?)Windows平臺模擬其他幾個操作,例如deadline_timer操作。

禁用線程支持的一種替代方法可能是避免這些模擬操作。我個人沒有在項目中使用BOOST_ASIO_DISABLE_THREADS,所以我不確定它是否有其他副作用。

+2

當定義了'BOOST_ASIO_DISABLE_THREADS'時,Asio在嘗試產生一個線程時拋出'boost :: asio :: error :: operation_not_supported'錯誤。因此,唯一的選擇是避免線程產卵操作。在大多數實現中,這可以通過使用'resolve()'而不是'async_resolve()'來完成。在Windows上,定義'BOOST_ASIO_DISABLE_IOCP'將導致Asio使用基於選擇的實現,該實現比較慢,但不應該產生額外的線程。 – 2013-02-20 16:01:00

+0

謝謝,實際上我根本沒有找到這個文檔。我將嘗試使用DISABLE_IOCP – Rolle 2013-02-20 16:05:56

板凳
0
1

您是否真的測試過它,以查看線程是否在您的特定平臺上生成?如果沒有,問題解決!如果有的話,你可能會考慮像libevent或libev這樣的不同的圖書館。無論是那些,還是由像Qt這樣的各種庫提供的一大堆其他異步事件循環都可以工作。

+0

是的,我看到他們產卵。此外,這個lib被移植到許多平臺 – Rolle 2013-02-20 15:01:58

0
votes
answers
26 views
+10

的boost :: message_queue ::接收/發送不與最新版本

1

當我使用Boost 1.53.0,我用的發送和接收這樣的:的boost :: message_queue ::接收/發送不與最新版本

int i=0; 
msg_queue.send(&i, sizeof(i), 0); 

int number; 
unsigned int priority = 0; 
boost::interprocess::message_queue::size_type recvd_size; 
msg_queue.receive(&number, sizeof(number), recvd_size, priority); 

現在,使用最新的1.65.1版本,我得到一個無效的參數錯誤,這個問題似乎是的sizeof()

Boost文檔沒有1.53.0版本1.65.1之間切換。 Message_queue Doc

發送的簽名和接收需要SIZE_TYPE我曾經的sizeof(),我試圖將它轉換爲SIZE_TYPE,使用SIZE_TYPE可變,但是在運行時我會遇到一個庫錯誤。

感謝您的幫助了。

編輯: 要將用戶的要求,這裏是我得到的這取決於什麼我嘗試不同的錯誤消息。

#1 attempt: msg_queue.receive(&number, sizeof(number), recvd_size, priority); 
#1 Error at compile time: Invalid arguments 'Canditates are: void send(const void *, ?, unsigned int)' 
#1 Comment: Same error for Message_Queue::Send() 

與之前版本相同的代碼,我能夠發送和接收值。

+0

什麼是完整的,完整的錯誤消息? –

沙发
0
0

沒有看到真正的編譯器錯誤,我認爲這個問題是不是priority。它應該通過左值引用傳遞,但類型不匹配(應該是無符號):

#include <boost/interprocess/ipc/message_queue.hpp> 

namespace bip = boost::interprocess; 

bip::message_queue msg_queue(bip::open_or_create, "bla", 10, 10240); 

int main() { 
    int i=0; 
    msg_queue.send(&i, sizeof(i), 0); 

    int number; 
    unsigned priority = 0; 
    boost::interprocess::message_queue::size_type recvd_size; 
    msg_queue.receive(&number, sizeof(number), recvd_size, priority); 
} 

升壓的確沒有1.531.65.1但也許你的代碼或編譯器做之間切換。

看到它Live On Coliru

+0

事實上,當務之急是無符號的,我只是犯了一個錯誤,而在計算器上書面方式。 「沒有看到真正的編譯器錯誤」是什麼意思? – vincedjango

0
votes
answers
36 views
+10

如何重新啓動提升截止日期計時器

0

我有一個要求,我的計時器必須根據2個條件進行重置,以先發生者爲準。如何重新啓動提升截止日期計時器

  1. 當計時器到期
  2. 當滿足特定條件(如內存達到某一限度)

我以下步驟:

boost::asio::io_service io; 
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1)); 
boost::mutex mtx1; 

void run_io_service() 
{ 
    io.run(); 
} 

void print(const boost::system::error_code& /*e*/) 
{ 
    boost::mutex::scoped_lock lock(mtx1); 
    std::cout << "Hello, world!
"; 
    t.expires_from_now(boost::posix_time::seconds(1)); 
    t.async_wait(print); 
    std::cout << "Print executed
"; 
} 
int main() 
{ 
    t.async_wait(print); 
    boost::thread monitoring_thread = boost::thread(run_io_service); 
    boost::this_thread::sleep(boost::posix_time::seconds(2)); 
    t.cancel(); 
    std::cout << "Resetting Timer
"; 
    t.async_wait(print); 
    boost::this_thread::sleep(boost::posix_time::seconds(2)); 
    t.cancel(); 
    io.stop(); 
    monitoring_thread.join(); 
    return 0; 
} 

此代碼工作正常,直到時間計時器尚未取消。 一旦定時器被取消,定時器不能以預期的方式工作,它根本不起作用。

我在做什麼錯?

+0

你能否澄清你期望這個程序輸出什麼,它實際輸出什麼,以及爲什麼你認爲這意味着定時器不工作? – 2014-11-24 08:10:12

沙发
0
2

第一個問題是如果出現錯誤(例如被取消),處理程序仍將被調用,則需要檢查錯誤代碼。

void print(const boost::system::error_code& e) 
{ 
    if(e) return; // we were cancelled 
    // actual error code for cancelled is boost::asio::error::operation_aborted 

    boost::mutex::scoped_lock lock(mtx1); 
    std::cout << "Hello, world!
"; 
    t.expires_from_now(boost::posix_time::seconds(1)); 
    t.async_wait(print); 
    std::cout << "Print executed
"; 
} 

其次,當你取消計時器,離開了io_service對象沒有任何工作,這意味着run_io_service線程將終止,讓你沒有服務。整個節目過程中保持服務活着,給它一個工作對象在主開始:

int main() { 
    boost::asio::io_service::work work(io); 
    ... 

和..如sehe提到的,你是不是安全處理的定時器(或std ::法院) 。當你打印重置信息並重置定時器時,你應該鎖定mtx1,否則墨菲法則規定它可能在處理程序正在運行並且弄亂了事情的時刻發生。

+0

這是現貨。 +1 – sehe 2014-11-24 08:24:22

板凳
0
2

您需要設置新的過期時間。

事實上,您不必在此事件中明確取消,因爲設置新的期望會隱式取消任何待處理的異步等待。

請記住deadline_timer對象本身並不是線程安全的,因此您需要保持計時器突變同步。

+0

謝謝。處理錯誤幫助。 那麼,每次我們需要重置計時器時,我們不需要停止io服務嗎?在相同的定時器上使用async_wait會重置它? – garima721 2014-11-24 11:34:09

+0

不,是的。你可以隨時查看文檔。 (順便提一下,'io_service'是線程安全的) – sehe 2014-11-24 11:52:39

+0

非常感謝。這解決了我的問題。 – garima721 2014-11-25 02:48:03

0
votes
answers
15 views
+10

Boost.Process - 如何讓一個進程運行一個函數?

3

因此,我想,雖然它並沒有被接納進入Boost發佈尚未做一些與Boost.ProcessBoost.Process - 如何讓一個進程運行一個函數?

simpliest PROGRAMM會是什麼樣子

#include <boost/process.hpp> 
#include <string> 
#include <vector> 

namespace bp = ::boost::process; 

void Hello() 
{ 
    //... contents does not matter for me now - I just want to make a new process running this function using Boost.Process. 
} 

bp::child start_child() 
{ 
    std::string exec = "bjam"; 

    std::vector<std::string> args; 
    args.push_back("--version"); 

    bp::context ctx; 
    ctx.stdout_behavior = bp::silence_stream(); 

    return bp::launch(exec, args, ctx); 
} 

int main() 
{ 
    bp::child c = start_child(); 

    bp::status s = c.wait(); 

    return s.exited() ? s.exit_status() : EXIT_FAILURE; 
} 

我創造如何高大的進程執行你好()函數?

沙发
0
7

你不能。另一個進程是另一個可執行文件除非你生成同一程序的另一個實例,否則子進程甚至不會包含Hello()函數。

如果孩子是你的程序的另一個實例,您需要定義自己的方式告訴孩子跑你好()。這可能是工藝參數或性病的一些協議:CIN(即使用標準輸入進程間通信)

在UNIX/Linux平臺上,你可以啓動另一個過程,而不是運行不同的可執行文件。請參閱fork(2)系統調用。然後你可以在子裏調用Hello()。但是boost :: process:launch(在這樣的平臺上映射到fork + exec,plain fork()不是通過boost提供的,例如因爲它不存在於其他平臺上

可能存在極其平臺 - 依賴方式做你想做的事,但你不想去那裏

+0

所以這意味着Boost.Process只是一個庫,可以啓動不止一次的命令行參數我的過程? – Rella 2011-01-23 17:09:38