精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++ 多線程編程總結

開發 后端 開發工具
在開發C++程序時,一般在吞吐量、并發、實時性上有較高的要求。設計C++程序時,總結起來可以從如下幾點提高效率:并發、異步、緩存。詳細情況下文

在開發C++程序時,一般在吞吐量、并發、實時性上有較高的要求。設計C++程序時,總結起來可以從如下幾點提高效率:

● l 并發

● l 異步

● l 緩存

下面將我平常工作中遇到一些問題例舉一二,其設計思想無非以上三點。

1任務隊列

1.1 以生產者-消費者模型設計任務隊列

生產者-消費者模型是人們非常熟悉的模型,比如在某個服務器程序中,當User數據被邏輯模塊修改后,就產生一個更新數據庫的任務(produce),投遞給IO模塊任務隊列,IO模塊從任務隊列中取出任務執行sql操作(consume)。

設計通用的任務隊列,示例代碼如下:

詳細實現可參見:

http://ffown.googlecode.com/svn/trunk/fflib/include/detail/task_queue_impl.h

  1. void task_queue_t::produce(const task_t& task_) {  
  2.  lock_guard_t lock(m_mutex);  
  3.  if (m_tasklist->empty()){//! 條件滿足喚醒等待線程  
  4.  m_cond.signal();  
  5.  }  
  6.  m_tasklist->push_back(task_);  
  7.  }  
  8.  int task_queue_t::comsume(task_t& task_){  
  9.  lock_guard_t lock(m_mutex);  
  10.  while (m_tasklist->empty())//! 當沒有作業時,就等待直到條件滿足被喚醒{  
  11.  if (false == m_flag){  
  12.  return -1;  
  13.  }  
  14.  m_cond.wait();  
  15.  }  
  16.  task_ = m_tasklist->front();  
  17.  m_tasklist->pop_front();  
  18.  return 0;  
  19.  } 

1.2 任務隊列使用技巧

1.2.1 IO 與 邏輯分離

比如網絡游戲服務器程序中,網絡模塊收到消息包,投遞給邏輯層后立即返回,繼續接受下一個消息包。邏輯線程在一個沒有io操作的環境下運行,以保障實時性。示例:

  1. void handle_xx_msg(long uid, const xx_msg_t& msg){  
  2.  logic_task_queue->post(boost::bind(&servie_t::proces, uid, msg));  
  3.  } 

注意,此模式下為單任務隊列,每個任務隊列單線程。

1.2.2 并行流水線

上面的只是完成了io 和 cpu運算的并行,而cpu中邏輯操作是串行的。在某些場合,cpu邏輯運算部分也可實現并行,如游戲中用戶A種菜和B種菜兩種操作是完全可以并行的,因為兩個操作沒有共享數據。最簡單的方式是A、B相關的操作被分配到不同的任務隊列中。示例如下:

  1. void handle_xx_msg(long uid, const xx_msg_t& msg) {  
  2.  logic_task_queue_array[uid % sizeof(logic_task_queue_array)]->post(  
  3.  boost::bind(&servie_t::proces, uid, msg));  
  4.  } 

注意,此模式下為多任務隊列,每個任務隊列單線程。

1.2.3 連接池與異步回調

比如邏輯Service模塊需要數據庫模塊異步載入用戶數據,并做后續處理計算。而數據庫模塊擁有一個固定連接數的連接池,當執行SQL的任務到來時,選擇一個空閑的連接,執行SQL,并把SQL 通過回調函數傳遞給邏輯層。其步驟如下:

●n 預先分配好線程池,每個線程創建一個連接到數據庫的連接

●n 為數據庫模塊創建一個任務隊列,所有線程都是這個任務隊列的消費者

●n 邏輯層想數據庫模塊投遞sql執行任務,同時傳遞一個回調函數來接受sql執行結果

示例如下:

  1. void db_t:load(long uid_, boost::functionpost(boost::bind(&db_t:load, uid, func)); 

注意,此模式下為單任務隊列,每個任務隊列多線程。

2. 日志

本文主要講C++多線程編程,日志系統不是為了提高程序效率,但是在程序調試、運行期排錯上,日志是無可替代的工具,相信開發后臺程序的朋友都會使用日志。常見的日志使用方式有如下幾種:

●n 流式,如logstream << “start servie time[%d]” << time(0) << ” app name[%s]” << app_string.c_str() << endl;

●n Printf 格式如:logtrace(LOG_MODULE, “start servie time[%d] app name[%s]“, time(0), app_string.c_str());

二者各有優缺點,流式是線程安全的,printf格式格式化字符串會更直接,但缺點是線程不安全,如果把app_string.c_str() 換成app_string (std::string),編譯被通過,但是運行期會crash(如果運氣好每次都crash,運氣不好偶爾會crash)。我個人鐘愛printf風格,可以做如下改進:

●l 增加線程安全,利用C++模板的traits機制,可以實現線程安全。示例:

  1. template 
  2.  void logtrace(const char* module, const char* fmt, ARG1 arg1){  
  3.  boost::format s(fmt);  
  4.  f % arg1;  
  5.  } 

這樣,除了標準類型+std::string 傳入其他類型將編譯不能通過。這里只列舉了一個參數的例子,可以重載該版本支持更多參數,如果你愿意,可以支持9個參數或更多。

●l 為日志增加顏色,在printf中加入控制字符,可以再屏幕終端上顯示顏色,Linux下示例:printf(“\033[32;49;1m [DONE] \033[39;49;0m")
更多顏色方案參見:

http://hi.baidu.com/jiemnij/blog/item/d95df8c28ac2815cb219a80e.html

●l 每個線程啟動時,都應該用日志打印該線程負責什么功能。這樣,程序跑起來的時候通過top –H – p pid 可以得知那個功能使用cpu的多少。實際上,我的每行日志都會打印線程id,此線程id非pthread_id,而其實是線程對應的系統分配的進程id號。

3. 性能監控

盡管已經有很多工具可以分析c++程序運行性能,但是其大部分還是運行在程序debug階段。我們需要一種手段在debug和release階段都能監控程序,一方面得知程序瓶頸之所在,一方面盡早發現哪些組件在運行期出現了異常。

通常都是使用gettimeofday 來計算某個函數開銷,可以精確到微妙。可以利用C++的確定性析構,非常方便的實現獲取函數開銷的小工具,示例如下:

  1. struct profiler{  
  2.  profiler(const char* func_name){  
  3.  gettimeofday(&tv, NULL);  
  4.  }  
  5.  ~profiler(){  
  6.  struct timeval tv2;  
  7.  gettimeofday(&tv2, NULL);  
  8.  long cost = (tv.tv_sec - tv.tv_sec) * 1000000 + (tv.tv_usec - tv.tv_usec);  
  9.  //! post to some manager  
  10.  }  
  11.  struct timeval tv;  
  12.  };  
  13.  #define PROFILER() profiler(__FUNCTION__) 

Cost 應該被投遞到性能統計管理器中,該管理器定時講性能統計數據輸出到文件中。

4 Lambda 編程

使用foreach 代替迭代器

很多編程語言已經內建了foreach,但是c++還沒有。所以建議自己在需要遍歷容器的地方編寫foreach函數。習慣函數式編程的人應該會非常鐘情使用foreach,使用foreach的好處多多少少有些,如:

http://www.cnblogs.com/chsword/archive/2007/09/28/910011.html

但主要是編程哲學上層面的。

示例:

  1. void user_mgr_t::foreach(boost::function func_){  
  2.  for (iterator it = m_users.begin(); it != m_users.end() ++it){  
  3.  func_(it->second);  
  4.  }  
  5.  } 

 比如要實現dump 接口,不需要重寫關于迭代器的代碼

  1. void user_mgr_t:dump(){  
  2.  struct lambda {  
  3.  static void print(user_t& user){  
  4.  //! print(tostring(user);  
  5.  }  
  6.  };  
  7.  this->foreach(lambda::print);  
  8.  } 

實際上,上面的代碼變通的生成了匿名函數,如果是c++ 11 標準的編譯器,本可以寫的更簡潔一些:

  1. this->foreach([](user_t& user) {} ); 

但是我大部分時間編寫的程序都要運行在centos 上,你知道嗎它的gcc版本是gcc 4.1.2, 所以大部分時間我都是用變通的方式使用lambda函數。

Lambda 函數結合任務隊列實現異步

常見的使用任務隊列實現異步的代碼如下:

  1. void service_t:async_update_user(long uid){  
  2.  task_queue->post(boost::bind(&service_t:sync_update_user_impl, this, uid));  
  3.  }  
  4.  void service_t:sync_update_user_impl(long uid){  
  5.  user_t& user = get_user(uid);  
  6.  user.update()  
  7.  } 

這樣做的缺點是,一個接口要響應的寫兩遍函數,如果一個函數的參數變了,那么另一個參數也要跟著改動。并且代碼也不是很美觀。使用lambda可以讓異步看起來更直觀,仿佛就是在接口函數中立刻完成一樣。示例代碼:

  1. void service_t:async_update_user(long uid){  
  2.  struct lambda {  
  3.  static void update_user_impl(service_t* servie, long uid){  
  4.  user_t& user = servie->get_user(uid);  
  5.  user.update();  
  6.  }  
  7.  };  
  8.  task_queue->post(boost::bind(&lambda:update_user_impl, this, uid));  
  9.  } 

 這樣當要改動該接口時,直接在該接口內修改代碼,非常直觀。

5. 奇技淫巧

利用shared_ptr 實現map/reduce

Map/reduce的語義是先將任務劃分為多個任務,投遞到多個worker中并發執行,其產生的結果經reduce匯總后生成最終的結果。Shared_ptr的語義是什么呢?當***一個shared_ptr析構時,將會調用托管對象的析構函數。語義和map/reduce過程非常相近。我們只需自己實現講請求劃分多個任務即可。示例過程如下:

●l 定義請求托管對象,加入我們需要在10個文件中搜索“oh nice”字符串出現的次數,定義托管結構體如下:

  1. struct reducer{  
  2.  void set_result(int index, long result) {  
  3.  m_result[index] = result;  
  4.  }  
  5.  ~reducer(){  
  6.  long total = 0;  
  7.  for (int i = 0; i < sizeof(m_result); ++i){  
  8.  total += m_result[i];  
  9.  }  
  10.  //! post total to somewhere  
  11.  }  
  12.  long m_result[10];  
  13.  }; 

●l 定義執行任務的 worker

  1. void worker_t:exe(int index_, shared_ptr ret) {  
  2.  ret->set_result(index, 100);  
  3.  } 

●l 將任務分割后,投遞給不同的worker

  1. shared_ptr ret(new reducer());  
  2.  for (int i = 0; i < 10; ++i) { task_queue[i]->post(boost::bind(&worker_t:exe, i, ret));  
  3.  } 

 原文鏈接:http://www.cnblogs.com/zhiranok/archive/2012/05/13/cpp_multi_thread.html

【編輯推薦】

  1. 為什么我希望用C而不是C++來實現ZeroMQ
  2. 猜猜這是什么編程語言寫的?
  3. 十條不錯的編程觀點
責任編輯:林師授 來源: 知然的博客
相關推薦

2010-02-05 15:30:54

C++多線程測試

2021-02-25 15:58:46

C++線程編程開發技術

2021-03-05 07:38:52

C++線程編程開發技術

2010-01-26 17:11:13

C++編程

2024-02-02 18:29:54

C++線程編程

2010-02-04 10:19:39

C++多線程

2010-01-18 14:09:58

C++多線程

2024-06-24 08:10:00

C++互斥鎖

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門

2024-10-21 16:59:37

C#編程多線程

2025-07-07 00:00:00

2024-11-05 16:29:57

2023-12-14 15:05:08

volatile代碼C++

2023-06-13 13:39:00

多線程異步編程

2009-03-12 10:52:43

Java線程多線程

2020-06-28 11:14:36

多線程性能結構

2024-06-24 12:57:09

多線程C++編程語言

2009-08-26 18:02:15

C#多線程

2017-02-27 16:43:34

Golang多線程編程

2023-04-02 17:53:10

多線程編程自測
點贊
收藏

51CTO技術棧公眾號

色wwwwww| 亚洲国产精品123| 欧美精品久久久久性色| 国产精品99| 91在线丨porny丨国产| 2019av中文字幕| 天天躁夜夜躁狠狠是什么心态| 五月激情久久| 国产精品初高中害羞小美女文| 成人久久久久爱| 国产亚洲精品久久久久久无几年桃| 白嫩白嫩国产精品| 色综合久久中文字幕| 亚洲精品乱码久久久久久蜜桃91| 夜夜嗨aⅴ一区二区三区| 我不卡影院28| 亚洲国产日韩欧美在线图片| www.亚洲天堂网| 日本激情视频在线观看| 成人午夜免费视频| 国产精品久久久久久久av大片| 69夜色精品国产69乱| 国产精品欧美一区二区三区不卡| 亚洲高清在线精品| 午夜精品一区二区三区在线观看| 午夜精品久久久久久久第一页按摩| 激情综合在线| 中文字幕国产日韩| 人妻av一区二区| 懂色aⅴ精品一区二区三区| 伊人婷婷欧美激情| 欧洲一区二区在线| 国产高清第一页| 久久久久久网| 欧美激情视频免费观看| 日韩毛片无码永久免费看| 亚洲3区在线| 在线视频一区二区三区| 强开小嫩苞一区二区三区网站| 视频一区二区在线播放| 蜜臀a∨国产成人精品| 97视频国产在线| 日本午夜在线观看| av伊人久久| 亚洲国产成人久久综合一区| 狠狠操狠狠干视频| 北岛玲heyzo一区二区| 色8久久久久| 国产欧美激情| 久久中文字幕视频| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 久久久视频精品| 少妇的滋味中文字幕bd| 你懂的一区二区三区| 精品福利一二区| www欧美激情| 成人软件在线观看| 岛国av一区二区| 久操手机在线视频| 国产激情在线观看| 国产精品福利影院| 亚洲v国产v在线观看| 久久手机免费观看| 99re6这里只有精品视频在线观看| 亚洲一区二区三区视频| 91美女精品网站| 蜜桃视频在线观看一区二区| 欧美最猛黑人xxxx黑人猛叫黄| 国产香蕉在线视频| 亚洲私拍自拍| 欧美国产在线电影| 青青青在线视频| 欧美99在线视频观看| 久久精品国产亚洲精品2020| 亚洲精品久久久久久国| 午夜激情久久| 久久在线观看视频| 51精品免费网站| 亚洲综合专区| 欧美日本黄视频| 免费在线观看日韩| 精品999日本| 91精品国产一区| 一本一道无码中文字幕精品热| 久久精品一区二区三区中文字幕| 欧美综合国产精品久久丁香| 久久亚洲天堂网| 久久亚洲视频| 国产精品香蕉av| 亚洲中文字幕在线观看| 久久电影国产免费久久电影| 91精品一区二区| www男人的天堂| av色综合久久天堂av综合| 精品一卡二卡三卡四卡日本乱码 | 欧美办公室脚交xxxx| 黑人精品xxx一区| 91在线视频观看免费| 欧美一级网址| 日韩免费看网站| 偷偷色噜狠狠狠狠的777米奇| 宅男在线一区| 最近中文字幕日韩精品 | 日韩欧美xxxx| 午夜日韩成人影院| 色94色欧美sute亚洲线路一久 | 正在播放一区二区| 国产精品91av| 神马影视一区二区| 久久精品久久精品亚洲人| 国产午夜精品无码| 日本v片在线高清不卡在线观看| 成人激情电影一区二区| www.97av.com| av日韩在线网站| 天堂社区 天堂综合网 天堂资源最新版 | 国产精品一区二区三区免费视频| 国产99999| 粉嫩av一区二区三区在线播放| 鲁丝一区鲁丝二区鲁丝三区| 男人影院在线观看| 亚洲va欧美va人人爽| 国产精品拍拍拍| 一区二区三区视频免费视频观看网站 | 欧美日韩二三区| 欧美伊人亚洲伊人色综合动图| 日韩精品一区二区三区在线| 国产一区二区三区四区五区六区| 91一区二区| 国产mv免费观看入口亚洲| 国产v在线观看| 欧美激情自拍偷拍| 久久国产午夜精品理论片最新版本| 国产私拍福利精品视频二区| 亚洲成人动漫在线播放| 最新av电影网站| 午夜综合激情| 国产精品香蕉视屏| 欧美另类极品| 在线一区二区视频| 亚洲熟女一区二区| 婷婷综合五月| 国产精品高精视频免费| 亚洲人在线观看视频| 亚洲精品成人天堂一二三| 精品视频无码一区二区三区| 国产成人在线中文字幕| 超碰日本道色综合久久综合 | 这里只有精品免费| 99在线视频免费| 亚洲欧美久久| 国产尤物99| www欧美xxxx| 欧美成人精品高清在线播放| 日韩欧美123区| 免费成人av资源网| 97netav| 成人在线高清视频| 色综合久久99| 久久精品国产亚洲av麻豆| 亚洲特级毛片| 99国产盗摄| av网址在线| 欧美一区二区三区在| 成人在线一级片| 欧美日韩在线大尺度| 亚洲精品免费网站| 黄色一级大片在线免费看产| 欧美日韩精品电影| 欧美性猛交xxxx乱大交少妇| 蜜桃精品视频在线观看| 亚洲不卡1区| 亚洲在线资源| 欧美精品在线免费播放| а中文在线天堂| 久久久精品黄色| av五月天在线| 欧美激情黄色片| 成人黄色在线播放| 久久国产精品黑丝| 亚洲经典中文字幕| 美日韩一二三区| 久久久99久久| 日韩精品视频一二三| 亚洲精品国产偷自在线观看| 91亚洲永久免费精品| 免费电影视频在线看 | 成人黄色三级视频| 久久一区二区三区四区| 美女网站免费观看视频| 四季av在线一区二区三区| 成人疯狂猛交xxx| 伊人影院在线视频| 亚洲成人精品久久久| 日韩 欧美 亚洲| 久久欧美一区二区| 亚洲综合色在线观看| 九九免费精品视频在线观看| 日本国产一区二区三区| 成人午夜电影在线观看| 91精品欧美一区二区三区综合在 | 国产成年人在线观看| 一区二区三区四区视频免费观看| 久久久久久久久久久人体| 91精品国产乱码久久| 国产精品免费久久久久| 亚洲午夜精品在线观看| 亚洲一级在线| 伊人久久99| 日韩精品三级| 性色av一区二区三区在线观看| 粉嫩av在线播放| 精品少妇一区二区三区免费观看 | 亚洲黄色免费网站| 先锋资源av在线| 久久精品国产亚洲高清剧情介绍| 日韩一级性生活片| 久久电影院7| 国产精品久久波多野结衣| 成人影院大全| 欧美老女人xx| h视频在线免费| 亚洲电影免费观看高清| 久久久久久无码午夜精品直播| 亚洲免费资源在线播放| 日本少妇高潮喷水xxxxxxx| 国产精品白丝jk黑袜喷水| 可以免费观看av毛片| 欧美国产免费| 亚洲视频在线二区| 亚洲一区二区三区中文字幕在线观看 | 9国产精品午夜| 国产精品视频免费在线| 2020av在线| 欧美插天视频在线播放| 香蕉视频网站在线| 精品久久久三级丝袜| 亚洲影院在线播放| 一区二区三区日韩欧美| 欧美88888| 久久精品人人爽人人爽| 91精品又粗又猛又爽| 韩国三级电影一区二区| 91香蕉视频污版| 久久精品午夜| 91免费视频网站在线观看| 亚洲视频综合| 亚洲一区二区三区欧美| 免费精品国产| 久久亚洲精品欧美| 国产精品任我爽爆在线播放| 亚洲已满18点击进入在线看片| 久久uomeier| 欧美性受xxx| 亚洲欧洲美洲av| 26uuu另类亚洲欧美日本一| 日本最新在线视频| 中文字幕精品在线| 国产精品99999| 亚洲午夜精品久久久久久性色 | 在线观看国产91| 日本久久综合网| 久草免费新视频| 有码一区二区三区| 久久艹精品视频| 国产精品美女久久久久久2018| 欧美图片自拍偷拍| 国产a视频精品免费观看| japan高清日本乱xxxxx| 国产精品一级黄| 中文字幕亚洲影院| 国内精品伊人久久久久av影院| 国产av无码专区亚洲精品| 久久福利一区| 日本新janpanese乱熟| 奇米亚洲午夜久久精品| 女人高潮一级片| 国产激情一区二区三区| 久久久久中文字幕亚洲精品| 蜜桃av一区二区在线观看| 欧美精品久久久久久久久25p| 美女视频一区二区三区| 国产免费中文字幕| 久久久久久亚洲精品杨幂换脸| 精品欧美一区免费观看α√| 久久亚洲不卡| 中文字幕第一页在线视频| 日本aⅴ精品一区二区三区| 99视频免费播放| 国产制服丝袜一区| 国产日韩成人内射视频| 午夜亚洲激情| 一女二男3p波多野结衣| 国产精品资源站在线| 日韩少妇一区二区| 久久精子c满五个校花| 国产美女网站视频| 一区二区三区丝袜| 亚洲国产精一区二区三区性色| 欧美日韩精品在线视频| 啪啪小视频网站| 欧美精品免费视频| 黄色片一区二区| 国产亚洲欧美日韩美女| av片哪里在线观看| 日产精品99久久久久久| 久久国产精品免费一区二区三区| 国产伦精品一区二区三区在线| 精品视频久久| 奇米777四色影视在线看| 99精品99| 日韩av自拍偷拍| 久久五月婷婷丁香社区| 国产少妇在线观看| 91九色02白丝porn| 亚洲av无码国产综合专区| 亚洲成人999| 成人福利在线| 精品中文字幕视频| 亚洲最大成人| 国产精品揄拍一区二区| 久久久久久久久久久久久久久久久久久久| 手机看片福利永久国产日韩| 欧美人成在线| 三级a在线观看| www.日本不卡| 国产免费一区二区三区四区| 欧美日韩在线视频首页| 国产免费的av| 在线电影欧美日韩一区二区私密| 激情在线视频播放| 国产成人午夜视频网址| 日韩有码中文字幕在线| 欧美一区二区三区综合| 麻豆成人综合网| 亚洲精品视频网址| 91成人免费在线| 亚洲区小说区图片区| 九九热这里只有精品6| 国产精品亚洲四区在线观看| 偷拍视频一区二区| 久久深夜福利| 精品无码在线观看| 日韩欧美999| 五十路在线视频| 色综合久久88色综合天天看泰| 国产精品日本一区二区不卡视频| 亚洲乱码国产乱码精品天美传媒| 久久青草久久| 刘亦菲国产毛片bd| 欧美视频一区在线| 精品无吗乱吗av国产爱色| 国产精品高潮视频| 精品一级毛片| 日韩欧美在线免费观看视频| 99riav久久精品riav| 亚洲天堂视频网站| 亚洲精品色婷婷福利天堂| av蜜臀在线| 欧美高清性xxxxhdvideosex| 亚洲永久字幕| 波多野结衣一本| 日本韩国一区二区| 国产黄色片在线播放| 国产成人精品视| 婷婷激情久久| a在线观看免费视频| 国产精品麻豆一区二区| 国产精品玖玖玖| 久久久久久久影院| 欧美人妖在线观看| 久久久噜噜噜www成人网| 中文字幕免费在线观看视频一区| 中文字幕免费观看视频| 久久精品国产欧美激情| 在线视频亚洲欧美中文| 日韩伦理在线免费观看| av不卡免费电影| 国产成人精品网| 色妞一区二区三区| 国产一区二区三区国产精品| 日本aa在线观看| 久久精品夜色噜噜亚洲a∨| 一级特黄免费视频| 久久国内精品一国内精品| www.神马久久| 国产欧美高清在线| 国产精品国产三级国产三级人妇| 亚洲av永久无码国产精品久久 | 精品无码久久久久成人漫画| 日韩久久久精品| 黄色在线免费观看网站| 日本不卡免费新一二三区| 精品一区精品二区高清| 免费毛片一区二区三区| 亚洲欧美日韩中文视频| 亚洲欧美专区| 午夜啪啪免费视频| 久久综合色综合88| 国产又粗又长又大视频|