日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Boost】boost库asio详解2——strand与io_service区别

發布時間:2024/4/11 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Boost】boost库asio详解2——strand与io_service区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[cpp]?view plain?copy ?print?
  • namespace??
  • {??
  • ????//?strand提供串行執行,?能夠保證線程安全,?同時被post或dispatch的方法,?不會被并發的執行.???
  • ????//?io_service不能保證線程安全??
  • ????boost::asio::io_service?m_service;??
  • ????boost::asio::strand?m_strand(m_service);??
  • ????boost::mutex?m_mutex;??
  • ??
  • ????void?print(int?id)??
  • ????{??
  • ????????//?boost::mutex::scoped_lock?lock(m_mutex);??
  • ????????static?int?count?=?0;??
  • ????????PRINT_DEBUG("id:?"?<<?boost::lexical_cast<std::string>(id));??
  • ????????PRINT_DEBUG("count:?"?<<?boost::lexical_cast<std::string>(++count));??
  • ????}??
  • ??????
  • ????void?ioRun1()??
  • ????{??
  • ????????while(true)??
  • ????????{??
  • ????????????m_service.run();??
  • ????????}??
  • ????}??
  • ??
  • ????void?ioRun2()??
  • ????{??
  • ????????while(true)??
  • ????????{??
  • ????????????m_service.run();??
  • ????????}??
  • ????}??
  • ??
  • ????void?strand_print1()??
  • ????{??
  • ????????//?PRINT_DEBUG("Enter?print1");??
  • ????????m_strand.dispatch(boost::bind(print,?1));??
  • ????????//?PRINT_DEBUG("Exit?print1");??
  • ????}??
  • ??
  • ????void?strand_print2()??
  • ????{??
  • ????????//?PRINT_DEBUG("Enter?print2");??
  • ????????m_strand.post(boost::bind(print,?2));??
  • ????????//?PRINT_DEBUG("Exit?print2");??
  • ????}??
  • ??
  • ????void?strand_print3()??
  • ????{??
  • ????????//?PRINT_DEBUG("Enter?print3");????????????????
  • ????????m_strand.post(boost::bind(print,?3));??
  • ????????//?PRINT_DEBUG("Exit?print3");??
  • ????}??
  • ??
  • ????void?strand_print4()??
  • ????{??
  • ????????//?PRINT_DEBUG("Enter?print4");??
  • ????????m_strand.post(boost::bind(print,?4));??
  • ????????//?PRINT_DEBUG("Exit?print4");??
  • ????}??
  • ??
  • ????//?將上面的m_strand換成m_service后,??
  • ????void?service_print1()??
  • ????{??
  • ????????//?PRINT_DEBUG("Enter?print1");??
  • ????????m_service.dispatch(boost::bind(print,?1));??
  • ????????//?PRINT_DEBUG("Exit?print1");??
  • ????}??
  • ??
  • ????void?service_print2()??
  • ????{??
  • ????????//?PRINT_DEBUG("Enter?print2");??
  • ????????m_service.post(boost::bind(print,?2));??
  • ????????//?PRINT_DEBUG("Exit?print2");??
  • ????}??
  • ??
  • ????void?service_print3()??
  • ????{??
  • ????????//?PRINT_DEBUG("Enter?print3");????????????????
  • ????????m_service.post(boost::bind(print,?3));??
  • ????????//?PRINT_DEBUG("Exit?print3");??
  • ????}??
  • ??
  • ????void?service_print4()??
  • ????{??
  • ????????//?PRINT_DEBUG("Enter?print4");??
  • ????????m_service.post(boost::bind(print,?4));??
  • ????????//?PRINT_DEBUG("Exit?print4");??
  • ????}??
  • }??
  • ??
  • void?test_strand()??
  • {??
  • ????boost::thread?ios1(ioRun1);??
  • ????boost::thread?ios2(ioRun2);??
  • ??????
  • ????boost::thread?t1(strand_print1);??
  • ????boost::thread?t2(strand_print2);??
  • ????boost::thread?t3(strand_print3);??
  • ????boost::thread?t4(strand_print4);??
  • ??
  • ????t1.join();??
  • ????t2.join();??
  • ????t3.join();??
  • ????t4.join();??
  • ??
  • ????m_server.run();??
  • }??
  • ??
  • void?test_service()??
  • {??
  • ????boost::thread?ios1(ioRun1);??
  • ????boost::thread?ios2(ioRun2);??
  • ??
  • ????boost::thread?t1(service_print1);??
  • ????boost::thread?t2(service_print2);??
  • ????boost::thread?t3(service_print3);??
  • ????boost::thread?t4(service_print4);??
  • ??????
  • ????t1.join();??
  • ????t2.join();??
  • ????t3.join();??
  • ????t4.join();??
  • ??????
  • ????m_service.run();??
  • }??
  • test_strand的執行結果:
    [cpp]?view plain?copy ?print?
  • 2013-01-05?17:25:34?626?[8228]?DEBUG?-?id:?4??
  • 2013-01-05?17:25:34?631?[8228]?DEBUG?-?count:?1??
  • 2013-01-05?17:25:34?634?[5692]?DEBUG?-?id:?1??
  • 2013-01-05?17:25:34?637?[5692]?DEBUG?-?count:?2??
  • 2013-01-05?17:25:34?640?[5692]?DEBUG?-?id:?2??
  • 2013-01-05?17:25:34?642?[5692]?DEBUG?-?count:?3??
  • 2013-01-05?17:25:34?646?[5692]?DEBUG?-?id:?3??
  • 2013-01-05?17:25:34?649?[5692]?DEBUG?-?count:?4??
  • test_ioserivice的執行結果:
    [cpp]?view plain?copy ?print?
  • 2013-01-05?17:26:28?071?[3236]?DEBUG?-?id:?1??
  • 2013-01-05?17:26:28?071?[5768]?DEBUG?-?id:?2??
  • 2013-01-05?17:26:28?071?[5108]?DEBUG?-?id:?3??
  • 2013-01-05?17:26:28?076?[3236]?DEBUG?-?count:?1??
  • 2013-01-05?17:26:28?079?[5768]?DEBUG?-?count:?2??
  • 2013-01-05?17:26:28?083?[5108]?DEBUG?-?count:?3??
  • 2013-01-05?17:26:28?087?[3236]?DEBUG?-?id:?4??
  • 2013-01-05?17:26:28?099?[3236]?DEBUG?-?count:?4??
  • 從結果可以看到, 在test_strand中print中兩個打印函數成對執行, 在test_ioservice兩個打印函數就沒有線程安全可言了.
    如果要保證test_ioservice同步, 就要加上mutex, 在代碼中被注釋的那句.?

    注意從日志的線程號中可知: 真正執行print()是主線程, ios1, ios2, 而t1, t2, t3, t4線程只是往ioservice的隊列中加入任務.
  • 總結

    以上是生活随笔為你收集整理的【Boost】boost库asio详解2——strand与io_service区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。