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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 13893 | 回復(fù): 25
打印 上一主題 下一主題

[C++] C/C++多線程怎么單線程還慢 [復(fù)制鏈接]

論壇徽章:
19
CU大;照
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-07-19 16:40 |只看該作者 |倒序瀏覽
我這兩天看Java多線程編程,順便把程序改成了C/C++多線程的,然后發(fā)現(xiàn)debug版本的運行速度還沒有單線程的和java版的快,而且差距不。
release版的目前還沒有出現(xiàn)過結(jié)果……

這是什么情況

論壇徽章:
0
2 [報告]
發(fā)表于 2013-07-19 16:42 |只看該作者
cpu單核的?

論壇徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大;照
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
3 [報告]
發(fā)表于 2013-07-19 16:46 |只看該作者
天不再藍 發(fā)表于 2013-07-19 16:42
cpu單核的?


Intel i5 430M 虛擬四核

論壇徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大;照
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大;照
日期:2013-04-17 11:19:32CU大;照
日期:2013-04-17 11:19:28
4 [報告]
發(fā)表于 2013-07-19 16:48 |只看該作者
C語言版源代碼

  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. #include <math.h>
  5. #include <time.h>

  6. typedef struct {
  7.         int id;
  8.         long lower;
  9.         long upper;
  10.         int total;
  11. } Message;

  12. int flag[4] = { 0, 0, 0, 0 };  //用于確定線程是否執(zhí)行完畢

  13. int isPrime(long number) {
  14.         if (1 >= number) {
  15.                 return 0;
  16.         }
  17.         long i;
  18.         for (i = 2; i <= sqrt(number); i++) {
  19.                 if (0 == number % i) {
  20.                         return 0;
  21.                 }
  22.         }
  23.         return 1;
  24. }

  25. void *countPrimeInRange(void* mess) {
  26.         long i = 0;
  27.         Message* message = (Message*) mess;
  28.         for (i = message->lower; i < message->upper; i++) {
  29.                 if (isPrime(i)) {
  30.                         message->total++;
  31.                 }
  32.         }
  33.         flag[message->id] = 1;
  34.         return NULL;
  35. }

  36. int countPrime(long number) {
  37.         int total = 0;
  38.         pthread_t thread[4];
  39.         Message *message[4];
  40.         long start = 0, end = 0;
  41.         long range = number / 4;
  42.         int i = 0;
  43.         for (i = 0; i < 4; i++) {
  44.                 message[i] = (Message*) malloc(sizeof(Message));
  45.         }
  46.         for (i = 0; i < 4; i++) {
  47.                 start = 0 + range * i;
  48.                 if (i < 3) {
  49.                         end = start + range;
  50.                 } else {
  51.                         end = number;
  52.                 }
  53.                 message[i]->id = i;
  54.                 message[i]->lower = start;
  55.                 message[i]->upper = end;
  56.                 message[i]->total = 0;
  57.                 pthread_create(&thread[i], NULL, countPrimeInRange,
  58.                                 (void*) (message[i]));
  59.         }
  60.         i = 0;
  61.         while (i < 4) {
  62.                 if (1 == flag[i]) {
  63.                         total += message[i]->total;
  64.                         i++;
  65.                 }
  66.         }
  67.         return total;
  68. }

  69. int main(int argc, char *argv[]) {
  70.         time_t start, end;
  71.         time(&start);
  72.         int sum = countPrime(10000000);
  73.         time(&end);
  74.         printf("0-10000000之間有%ld個素數(shù)\n", sum);
  75.         printf("程序運行時間%d秒\n", end - start);
  76.         return 0;
  77. }
復(fù)制代碼

論壇徽章:
19
CU大;照
日期:2013-03-13 15:32:35CU大;照
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
5 [報告]
發(fā)表于 2013-07-19 16:51 |只看該作者
Boost版源代碼

Main函數(shù)所在文件
  1. #include "ConcurrentPrimeFinder.h"

  2. #include <stdio.h>
  3. #include <time.h>

  4. int main(int argc, char *argv[]) {
  5.         time_t start, end;
  6.         ConcurrentPrimeFinder finder;
  7.         time(&start);
  8.         int sum = finder.countPrime(10000000);
  9.         time(&end);
  10.         printf("0-10000000之間有%ld個素數(shù)\n", sum);
  11.         printf("程序運行時間%d秒\n", end - start);
  12.         return 0;
  13. }
復(fù)制代碼
  1. /*
  2. * ConcurrentPrimeFinder.h
  3. *
  4. *  Created on: 2013年7月19日
  5. *      Author: root
  6. */

  7. #ifndef CONCURRENTPRIMEFINDER_H_
  8. #define CONCURRENTPRIMEFINDER_H_

  9. #include <boost/thread.hpp>

  10. class ConcurrentPrimeFinder {
  11. public:
  12.         ConcurrentPrimeFinder();
  13.         virtual ~ConcurrentPrimeFinder();
  14.         int countPrime(long number);

  15. private:
  16.         int poolsize;
  17. };

  18. #endif /* CONCURRENTPRIMEFINDER_H_ */
復(fù)制代碼
  1. /*
  2. * ConcurrentPrimeFinder.cpp
  3. *
  4. *  Created on: 2013年7月19日
  5. *      Author: root
  6. */

  7. #include "ConcurrentPrimeFinder.h"

  8. ConcurrentPrimeFinder::ConcurrentPrimeFinder() {
  9.         poolsize = 4;

  10. }

  11. ConcurrentPrimeFinder::~ConcurrentPrimeFinder() {
  12. }

  13. bool isPrime(long number) {
  14.         if (1 >= number) {
  15.                 return false;
  16.         }
  17.         long i;
  18.         for (i = 2; i <= sqrt(number); i++) {
  19.                 if (0 == number % i) {
  20.                         return false;
  21.                 }
  22.         }
  23.         return true;
  24. }

  25. void countPrimeInRange(long int lower, long int upper, int *total, bool *flag) {
  26.         long i = 0;
  27.         for (i = lower; i < upper; i++) {
  28.                 if (isPrime(i)) {
  29.                         (*total)++;
  30.                 }
  31.         }
  32.         *flag = true;
  33. }

  34. int ConcurrentPrimeFinder::countPrime(long number) {
  35.         using namespace boost;
  36.         int total = 0, sum[4] = { 0 };
  37.         bool flag[4] = { false };
  38.         long start = 0, end = 0;
  39.         long range = number / poolsize;
  40.         int i = 0;
  41.         for (i = 0; i < poolsize; i++) {
  42.                 start = range * i;
  43.                 if (i < poolsize - 1) {
  44.                         end = start + range;
  45.                 } else {
  46.                         end = number;
  47.                 }
  48.                 thread mythread(
  49.                                 bind(&countPrimeInRange, start, end, &(sum[i]), &(flag[i])));
  50.         }
  51.         i = 0;
  52.         while (i < poolsize) {
  53.                 if (flag[i]) {
  54.                         total += sum[i];
  55.                         i++;
  56.                 }
  57.         }
  58.         return total;
  59. }
復(fù)制代碼

論壇徽章:
19
CU大;照
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大;照
日期:2013-04-17 11:19:37CU大;照
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
6 [報告]
發(fā)表于 2013-07-19 16:52 |只看該作者
這兩個都是一個問題,debug版運行緩慢,release版,就像進入死循環(huán)了

論壇徽章:
6
技術(shù)圖書徽章
日期:2013-11-13 11:11:27子鼠
日期:2014-02-20 17:54:13處女座
日期:2014-06-16 17:43:33午馬
日期:2014-08-08 09:11:17未羊
日期:2014-08-10 11:57:072015年辭舊歲徽章
日期:2015-03-03 16:54:15
7 [報告]
發(fā)表于 2013-07-19 17:01 |只看該作者
volatile
lock
asynchronous

論壇徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大;照
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大;照
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
8 [報告]
發(fā)表于 2013-07-19 17:06 |只看該作者
回復(fù) 7# littledick


    剛剛發(fā)現(xiàn)一個很嚴(yán)峻的問題,連main函數(shù)開頭的printf都執(zhí)行不了

論壇徽章:
19
CU大;照
日期:2013-03-13 15:32:35CU大;照
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大;照
日期:2013-04-17 11:19:37CU大;照
日期:2013-04-17 11:19:32CU大;照
日期:2013-04-17 11:19:28
9 [報告]
發(fā)表于 2013-07-19 17:15 |只看該作者
littledick 發(fā)表于 2013-07-19 17:01
volatile
lock
asynchronous


真的非常感謝你,你說的三個單詞,我用了第一個就解決問題了,那個變量i被編譯器優(yōu)化了,因此一直是死循環(huán)出不來

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
10 [報告]
發(fā)表于 2013-07-20 10:41 |只看該作者
本帖最后由 yulihua49 于 2013-07-20 10:46 編輯
方兆國 發(fā)表于 2013-07-19 16:40
我這兩天看Java多線程編程,順便把程序改成了C/C++多線程的,然后發(fā)現(xiàn)debug版本的運行速度還沒有單線程的和ja ...

這只是你的個例,不能作為普遍的結(jié)論。
一般多線程的設(shè)計,要依據(jù)業(yè)務(wù)性質(zhì),在某些可并行的瓶頸環(huán)節(jié)設(shè)置多線程,才能獲得好的效果。

for (i = 2; i <= sqrt(number); i++) {

你能不能先把sqrt求出來,別每次循環(huán)做?
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP