免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 13545 | 回复: 25
打印 上一主题 下一主题

[C++] C/C++多线程怎么单线程还慢 [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-19 16:40 |只看该作者 |倒序浏览
我这两天看Java多线程编程,顺便把程序改成了C/C++多线程的,然后发现debug版本的运行速度还没有单线程的和java版的快,而且差距不小;
release版的目前还没有出现过结果……

这是什么情况

论坛徽章:
0
2 [报告]
发表于 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 [报告]
发表于 2013-07-19 16:46 |只看该作者
天不再蓝 发表于 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 [报告]
发表于 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 };  //用于确定线程是否执行完毕

  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个素数\n", sum);
  75.         printf("程序运行时间%d秒\n", end - start);
  76.         return 0;
  77. }
复制代码

论坛徽章:
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 [报告]
发表于 2013-07-19 16:51 |只看该作者
Boost版源代码

Main函数所在文件
  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个素数\n", sum);
  11.         printf("程序运行时间%d秒\n", end - start);
  12.         return 0;
  13. }
复制代码
  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_ */
复制代码
  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. }
复制代码

论坛徽章:
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 [报告]
发表于 2013-07-19 16:52 |只看该作者
这两个都是一个问题,debug版运行缓慢,release版,就像进入死循环了

论坛徽章:
6
技术图书徽章
日期: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 [报告]
发表于 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 [报告]
发表于 2013-07-19 17:06 |只看该作者
回复 7# littledick


    刚刚发现一个很严峻的问题,连main函数开头的printf都执行不了

论坛徽章:
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 [报告]
发表于 2013-07-19 17:15 |只看该作者
littledick 发表于 2013-07-19 17:01
volatile
lock
asynchronous


真的非常感谢你,你说的三个单词,我用了第一个就解决问题了,那个变量i被编译器优化了,因此一直是死循环出不来

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期: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 [报告]
发表于 2013-07-20 10:41 |只看该作者
本帖最后由 yulihua49 于 2013-07-20 10:46 编辑
方兆国 发表于 2013-07-19 16:40
我这两天看Java多线程编程,顺便把程序改成了C/C++多线程的,然后发现debug版本的运行速度还没有单线程的和ja ...

这只是你的个例,不能作为普遍的结论。
一般多线程的设计,要依据业务性质,在某些可并行的瓶颈环节设置多线程,才能获得好的效果。

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

你能不能先把sqrt求出来,别每次循环做?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP