亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: hy036630
打印 上一主題 下一主題

多線程OR多進(jìn)程-訪存密集型應(yīng)用 [復(fù)制鏈接]

論壇徽章:
0
11 [報(bào)告]
發(fā)表于 2011-12-21 15:09 |只看該作者
hy036630 發(fā)表于 2011-12-21 14:58
不好意思 可能我上面沒有說清楚
我用的是下面這個(gè)環(huán)形隊(duì)列  無鎖的實(shí)現(xiàn)一個(gè)進(jìn)程讀,一個(gè)進(jìn)程寫,沒有牽涉 ...

不妨設(shè)置一個(gè)計(jì)數(shù)器,在“push時(shí)滿”和"pop時(shí)空"的時(shí)候++下,統(tǒng)計(jì)下一分鐘發(fā)生多少次,再?zèng)Q定下一步怎辦

論壇徽章:
0
12 [報(bào)告]
發(fā)表于 2011-12-21 15:16 |只看該作者
這倒是個(gè)好主意
我試試 謝謝了{(lán):3_188:}

論壇徽章:
11
未羊
日期:2013-12-16 12:45:4615-16賽季CBA聯(lián)賽之青島
日期:2016-04-11 19:17:4715-16賽季CBA聯(lián)賽之廣夏
日期:2016-04-06 16:34:012015亞冠之卡爾希納薩夫
日期:2015-11-10 10:04:522015亞冠之大阪鋼巴
日期:2015-07-30 18:29:402015亞冠之城南
日期:2015-06-15 17:56:392015亞冠之卡爾希納薩夫
日期:2015-05-15 15:19:272015亞冠之山東魯能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16賽季CBA聯(lián)賽之八一
日期:2016-07-22 09:41:40
13 [報(bào)告]
發(fā)表于 2011-12-21 15:39 |只看該作者
本帖最后由 zylthinking 于 2011-12-21 15:42 編輯
hy036630 發(fā)表于 2011-12-21 14:58
不好意思 可能我上面沒有說清楚
我用的是下面這個(gè)環(huán)形隊(duì)列  無鎖的實(shí)現(xiàn)一個(gè)進(jìn)程讀,一個(gè)進(jìn)程寫,沒有牽涉 ...


看代碼, 流水線中幾個(gè)線程都會(huì)處理同一份數(shù)據(jù)?
是不是這樣
  1. thread1(char* p){
  2.     static int n = 0;
  3.    n += p[1];
  4. }

  5. thread2(char* p){
  6.     static int n = 0;
  7.    n += p[2];
  8. }

  9. 。。。。。

  10. thread_i(char* p){
  11.     static int n = 0;
  12.    n += p[i];
  13. }
復(fù)制代碼
然而 p 是相同的?

論壇徽章:
0
14 [報(bào)告]
發(fā)表于 2011-12-21 17:12 |只看該作者
本帖最后由 sonicling 于 2011-12-21 17:13 編輯

用semaphore把隊(duì)列指針包起來,一來可以保護(hù)指針,二來可以及時(shí)喚醒等待線程。如果忙等的話,生產(chǎn)者線程更新了隊(duì)列,等到消費(fèi)者線程那邊發(fā)現(xiàn)的時(shí)候,黃花菜都涼了。

論壇徽章:
11
未羊
日期:2013-12-16 12:45:4615-16賽季CBA聯(lián)賽之青島
日期:2016-04-11 19:17:4715-16賽季CBA聯(lián)賽之廣夏
日期:2016-04-06 16:34:012015亞冠之卡爾希納薩夫
日期:2015-11-10 10:04:522015亞冠之大阪鋼巴
日期:2015-07-30 18:29:402015亞冠之城南
日期:2015-06-15 17:56:392015亞冠之卡爾希納薩夫
日期:2015-05-15 15:19:272015亞冠之山東魯能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16賽季CBA聯(lián)賽之八一
日期:2016-07-22 09:41:40
15 [報(bào)告]
發(fā)表于 2011-12-21 17:17 |只看該作者
sonicling 發(fā)表于 2011-12-21 17:12
用semaphore把隊(duì)列指針包起來,一來可以保護(hù)指針,二來可以及時(shí)喚醒等待線程。如果忙等的話,生產(chǎn)者線程更新 ...

它很顯然是多核, 倒不是這個(gè)原因, 很有可能是多處理器緩存同步

論壇徽章:
0
16 [報(bào)告]
發(fā)表于 2011-12-21 17:23 |只看該作者
也可以不用semaphore,但是要及時(shí)喚醒等待線程!否則等待線程會(huì)等到下一次自然調(diào)度才得到通知。

論壇徽章:
0
17 [報(bào)告]
發(fā)表于 2011-12-21 17:31 |只看該作者
CPU間緩存同步會(huì)影響效率,但是不至于數(shù)量級(jí)的差別。我以前也做過無鎖循環(huán)隊(duì)列,不過是內(nèi)核級(jí)的,用atomic_t來表示位置,每次更新隊(duì)列,強(qiáng)制喚醒消費(fèi)線程,吞吐量上60w/s無壓力。

論壇徽章:
0
18 [報(bào)告]
發(fā)表于 2011-12-22 08:08 |只看該作者
的確是這樣的,我覺得也不應(yīng)該是忙等的問題,應(yīng)為機(jī)器是16線程的機(jī)器,按照道理至少有8個(gè)獨(dú)立線程同時(shí)跑,
緩存我開始以為是這樣的原因

不過設(shè)置了CPU親和了以后也沒有效果。

論壇徽章:
0
19 [報(bào)告]
發(fā)表于 2011-12-22 08:11 |只看該作者
本帖最后由 hy036630 于 2011-12-22 08:12 編輯

我所謂的忙等是這個(gè)意思
從環(huán)形隊(duì)列取
while(NULL!=(event = queue.pop()));
doSomething();

插入到環(huán)形隊(duì)列里
while(queue.push(event));
doSomething();


在多核的機(jī)器上面,應(yīng)該不存在比較大的問題吧。

論壇徽章:
0
20 [報(bào)告]
發(fā)表于 2011-12-22 08:28 |只看該作者
sonicling 發(fā)表于 2011-12-21 17:31
CPU間緩存同步會(huì)影響效率,但是不至于數(shù)量級(jí)的差別。我以前也做過無鎖循環(huán)隊(duì)列,不過是內(nèi)核級(jí)的,用atomic_ ...

其實(shí)我覺得不是隊(duì)列慢了導(dǎo)致整體性能慢,
我覺得可能是增加流水線的長(zhǎng)度會(huì)導(dǎo)致處理數(shù)據(jù)的速度變慢。
我給大家貼一段處理的代碼吧。
  1. string GroupPE::getEventKey(eventPtr msg) {
  2.     vector<string> keys;
  3.     keys.push_back("UchAPN"); // apn
  4.     keys.push_back("Wlac"); // 位置區(qū)編號(hào):lacid
  5.     keys.push_back("Cell"); // 小區(qū)信息:sac
  6.     keys.push_back("InterfaceType"); // 接口類型:interfacetype
  7.     keys.push_back("Protocoltype"); // 協(xié)議類型:protocolid
  8.     keys.push_back("Eventtype"); // 事件類型:eventtype
  9.     string key = Utils::encoding(*msg, keys.begin(), keys.end(), 2000);
  10.     return key;
  11. }

  12.    /*每個(gè)線程有一個(gè)統(tǒng)計(jì)map 用來存放統(tǒng)計(jì)數(shù)據(jù) 每次來一個(gè)event就根據(jù)getEventKey這個(gè)方法得到key,然后查看key是不是在統(tǒng)計(jì)map中,如果在統(tǒng)計(jì)map中,那么更新這個(gè)map的數(shù)據(jù),如果沒有,那么new一個(gè)event,設(shè)置一些值,然后放到統(tǒng)計(jì)map中*/
  13. void GroupPE::process(eventPtr msg) {//統(tǒng)計(jì)
  14.   
  15.     string key = this->getEventKey(msg);
  16.     map<string, eventPtr>::iterator iter4map = this->groupMap.find(key);


  17.     if (iter4map != groupMap.end()) {
  18.         int times = iter4map->second->getValueByName("times", 0);
  19.         ++times;
  20.         iter4map->second->setValueByName("times", times);
  21.         if (msg->getValueByName("cause", -1) == 255) { // response success
  22.             times = iter4map->second->getValueByName("succtimes", 0);
  23.             ++times;
  24.             iter4map->second->setValueByName("succtimes", times);
  25.         }
  26.         string str = msg->getValueByName("Btime", "1970-01-01 00:00:00.000");
  27.         long btime = Utils::millisecs(str.c_str());
  28.         str = msg->getValueByName("RspTime", "1970-01-01 00:00:00.000");
  29.         long rsptime = Utils::millisecs(str.c_str());
  30.         double delays = ((double) rsptime - (double) btime) / 1000;
  31.         double d = iter4map->second->getValueByName("delays", (double) 0);
  32.         iter4map->second->setValueByName("delays", delays + d);

  33.         d = iter4map->second->getValueByName("maxdelays", (double) 0);
  34.         if (d < delays)
  35.             iter4map->second->setValueByName("maxdelays", delays);
  36.         d = iter4map->second->getValueByName("mindelays", (double) 0);
  37.         if (d > delays)
  38.             iter4map->second->setValueByName("mindelays", delays);
  39.         if (btime != rsptime || msg->getValueByName("Tdrtype", (char) 0) != 1) {
  40.             times = iter4map->second->getValueByName("rsptimes", 0);
  41.             ++times;
  42.             iter4map->second->setValueByName("rsptimes", times);
  43.         } else {
  44.         }
  45.     } else { // 進(jìn)行新統(tǒng)計(jì)結(jié)果記錄
  46.         // 如果單個(gè)map數(shù)量太大超過閥值,需要進(jìn)行清理
  47.         //begin use pointer add by lxy 7-19
  48. #ifndef NEW_ALLOC
  49.         CEventMessage *groupMapEvent = this->event_alloc.allocate(1);
  50.         groupMapEvent->metaData = NULL;
  51.         char * body = this->mt_allocator.allocate(150);
  52.         groupMapEvent->setBody(body);
  53.         EVENT_HEAD_MESSAGE * head = this->head_alloc.allocate(1); //new EVENT_HEAD_MESSAGE;
  54. #else
  55.         CEventMessage *groupMapEvent = new CEventMessage();
  56.         char * body = new char[150];
  57.         groupMapEvent->setBody(body);
  58.         EVENT_HEAD_MESSAGE * head = new EVENT_HEAD_MESSAGE(); //new EVENT_HEAD_MESSAGE;
  59. #endif
  60.         groupMapEvent->reset(head);
  61.         groupMapEvent->setHead(head);
  62.         groupMapEvent->getHead()->type = 2005; // 修改事件的類型為“統(tǒng)計(jì)事件對(duì)象”
  63.         groupMapEvent->getHead()->data_len = 150;
  64.         // 進(jìn)行業(yè)務(wù)信息初始化
  65.         groupMapEvent->setValueByName("times", 1);
  66.         //  groupMapEvent->setValueByName("cause", msg->getValueByName("cause", -1));
  67.         if (msg->getValueByName("Cause", -1) == 255)
  68.             groupMapEvent->setValueByName("succtimes", 1);
  69.         else
  70.             groupMapEvent->setValueByName("succtimes", 0);
  71.         string Btime_str = msg->getValueByName("Btime", "1970-01-01 00:00:00.000");
  72.         long btime = Utils::millisecs(Btime_str.c_str());
  73.         groupMapEvent->setValueByName("sttime", msg->getValueByName("Btime", "1970-01-01 00:00:00.000"));
  74.         string RspTime_str = msg->getValueByName("RspTime", "1970-01-01 00:00:00.000");
  75.         long rsptime = Utils::millisecs(RspTime_str.c_str());
  76.         double delays = ((double) rsptime - (double) btime) / 1000;
  77.         groupMapEvent->setValueByName("delays", delays);
  78.         groupMapEvent->setValueByName("maxdelays", delays);
  79.         groupMapEvent->setValueByName("mindelays", delays);
  80.         //  groupMapEvent->setValueByName("tdrtype", msg->getValueByName("tdrtype", 0));
  81.         if (btime != rsptime || msg->getValueByName("Tdrtype", (char) 0) != 1) {
  82.             groupMapEvent->setValueByName("rsptimes", 1);
  83.         } else {
  84.             groupMapEvent->setValueByName("rsptimes", 0);
  85.         }
  86.         //統(tǒng)計(jì)維度的設(shè)置  add by lxy 7-21
  87.         groupMapEvent->setValueByName("apn", msg->getValueByName("UchAPN", "*"));
  88.         groupMapEvent->setValueByName("lacid", msg->getValueByName("Wlac", 0));
  89.         groupMapEvent->setValueByName("sac", msg->getValueByName("Cell", 0));
  90.         groupMapEvent->setValueByName("interfacetype", msg->getValueByName("InterfaceType", "*"));
  91.         groupMapEvent->setValueByName("protocolid", msg->getValueByName("Protocoltype", "*"));
  92.         groupMapEvent->setValueByName("eventtype", msg->getValueByName("Eventtype", 0));
  93.         this->groupMap.insert(map<string, eventPtr, std::less<string>, __gnu_cxx::__mt_alloc<string> >::value_type(key, groupMapEvent));
  94.     }
  95. }
復(fù)制代碼
下面是Event的代碼 不好意思 有點(diǎn)長(zhǎng) 我截取一點(diǎn)給大家 CEventMessage.h
  1. class CEventMessage {
  2. public:

  3.     /*下面這些函數(shù)主要是根據(jù)類型找到配置文件然后在body的指定位置設(shè)置值*/
  4.     int getValueByName(const string &targetname, const int &defval) const; //
  5.     unsigned int getValueByName(const string &targetname, const unsigned int &defval) const;
  6.     long getValueByName(const string &targetname, const long &defval) const;
  7.     unsigned long getValueByName(const string &targetname, const unsigned long &defval) const;
  8.     char getValueByName(const string &targetname, const char &defval) const;
  9.     unsigned char getValueByName(const string &targetname, const unsigned char &defval) const;
  10.     short getValueByName(const string &targetname, const short &defval) const;
  11.     unsigned short getValueByName(const string &targetname, const unsigned short &defval) const;
  12.     string getValueByName(const string &targetname, const string &defval) const;
  13.     double getValueByName(const string &targetname, const double &defval) const;
  14.     float getValueByName(const string &targetname, const float &defval) const;


  15.     void setValueByName(const string &targetname, const int &val);
  16.     void setValueByName(const string &targetname, const unsigned int &val);
  17.     void setValueByName(const string &targetname, const long &val);
  18.     void setValueByName(const string &targetname, const unsigned long &val);
  19.     void setValueByName(const string &targetname, const short &val);
  20.     void setValueByName(const string &targetname, const unsigned short &val);
  21.     void setValueByName(const string &targetname, const char &val);
  22.     void setValueByName(const string &targetname, const unsigned char &val);
  23.     void setValueByName(const string &targetname, const float &val);
  24.     void setValueByName(const string &targetname, const string &val);
  25.     void setValueByName(const string &targetname, const double &val);

  26. public:

  27.     CEventMessage();
  28.     CEventMessage(const unsigned short& type);
  29.     CEventMessage(const CEventMessage& event);

  30.     CEventMessage& operator=(const CEventMessage& event);

  31.     virtual ~CEventMessage();

  32.     char * getBytes(int &length);

  33.     void setBody(char* body);

  34.     char* getBody() const;

  35.     void setHead(EVENT_HEAD_MESSAGE* head);

  36.     EVENT_HEAD_MESSAGE* getHead() const;

  37.     static void reset(EVENT_HEAD_MESSAGE *event_head_message) {
  38.         event_head_message->pkg_len = 1;
  39.         event_head_message->flag = 0;
  40.         event_head_message->format = 0;
  41.         event_head_message->ver_info = 1;
  42.         event_head_message->peid = 0;
  43.     }

  44.     unsigned int getPrevPEId() const {
  45.         if (head != NULL)
  46.             return head->peid;
  47.         return 0;
  48.     }

  49.     /**
  50.      * ??socket?жs???????
  51.      * @param conn
  52.      * @return
  53.      */

  54. private:

  55.     template<class T>
  56.     const EVENT_TYPE_ENTY * getCheckedEventTypeEntity(const string&name)const;
  57.     template<class T>
  58.     const EVENT_TYPE_ENTY * getCheckedEventTypeEntityAllocBody(const string&name);
  59.    
  60.     void resetFields(const CEventMessage& event);
  61.     string getStringForNum(EVENT_TYPE_ENTY *eventType)const;
  62.     void setStringFormNum(EVENT_TYPE_ENTY *eventType, const string&str_val) const;
  63.     CMetaData * getMetaData()const;    //元數(shù)據(jù) 就是配置文件 指示body中的數(shù)據(jù)是如何組成的
  64.     typedef hash_map<string, string> TempValueMap;
  65.     TempValueMap mytempvalmap;//用來存放臨時(shí)值 用于豐富維度用

  66. public:
  67.     CMetaData * metaData;
  68. private:

  69.     EVENT_HEAD_MESSAGE *head;  //用于網(wǎng)絡(luò)傳輸  head
  70.     char *body;                //實(shí)際數(shù)據(jù)
  71. };
復(fù)制代碼
CEventMessage.cpp太長(zhǎng)了就不放上來了 其實(shí)很簡(jiǎn)單  根據(jù)metaData找到配置,根據(jù)配置在body的指定位置設(shè)置值。

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP