先貼上代碼
#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/asio.hpp>
#include <thread>
#include <mutex>
#include <unistd.h>
boost::asio::io_service m_service;
boost::asio::io_service::strand m_strand(m_service);
std::mutex mtx;
void print(int id){
//mtx.lock();
//std::cout<<std::endl<<std::this_thread::get_id()<<std::endl;
static int cnt = 0;
std::cout<<"id: "<<id<<std::endl;
++cnt;
std::cout<<"count: "<<cnt<<std::endl;
//mtx.unlock();
}
void Run1(){
int ret = m_service.run_one();
std::cout<<"Run1 excute "<<ret<<" Handlers."<<std::endl;
}
void Run2(){
int ret = m_service.run_one();
std::cout<<"Run2 excute "<<ret<<" Handlers."<<std::endl;
}
void print1(){
m_strand.dispatch(m_strand.wrap(std::bind(print, 1)));
}
void print2(){
m_strand.post(m_strand.wrap(std::bind(print, 2)));
}
void print3(){
m_strand.post(m_strand.wrap(std::bind(print, 3)));
}
void print4(){
m_strand.post(m_strand.wrap(std::bind(print, 4)));
}
void test(){
std::thread t1(print1);
std::thread t2(print2);
std::thread t3(print3);
std::thread t4(print4);
//std::thread ios1(Run1);
//std::thread ios2(Run2);
t1.join();
t2.join();
t3.join();
t4.join();
//ios1.join();
//ios2.join();
int ret = m_service.run();
std::cout<<"Main thread excute "<<ret<<" Handlers."<<std::endl;
}
int main(int argc, const char ** argv){
try{
test();
}
catch(std::exception& e){
std::cout<<e.what()<<std::endl;
}
return 0;
}
編譯上面的代碼, 主行程在 test函式中呼叫m_service.run() 函式,可以執行四個Handler,但是回傳值確實 2,不是應該回傳4?求解???
另一個問題,當我多開兩個執行緒來呼叫 m_service.run_one() 的時候,偶爾會出現一種情況, 主行程的run回傳值為0, 另外呼叫run_one()函式的兩個執行緒,都會回 1, 但是通過列印執行緒ID發現, 這兩個回傳1 的執行緒,一個執行了一個Handler, 另外一個確執行了 3個 handler,主行程一個未執行, 這是怎么回事??????(初學者,發現這個問題,略迷茫,求大神指教,再次先謝過!)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/72785.html
標籤:網絡及通訊開發
下一篇:請教
