热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

有谁能够看懂这个程序呀:

怎么才能调试通过呀*******************

//怎么才能调试通过呀
//*                                                               *
//****************************************************************/
#include
<stdio.h>
#include
<pthread.h>
#include
<string.h>
#include
<sys/time.h>

#define MAXThreadsNum 32  //允许启动的最大线程数量

#define chunkSize 20000 //整数块的大小,每个整数块作为一个子任务,分发给一个线程
#define baseScope 1000   //先计算[1  baseScope]中的素数,以此为基础计算后面的素数
#define exPrimes 10
#define exIntegers  20

#define maximumPrimes 20000000

//全局数据
int search_scope_up_bound =30000000;     // 小于N的素数个数;
int primes[maximumPrimes];   //从primes[0] – primes[number-1] 中存放生成的素数;
int totalPrimes;      //primes中存放的素数总数
int unsearchedScope_low_bound;
int thread_num=0, task_id=0, result_id=0;
void *searchPrimes(void *);
pthread_mutex_t mutex1, mutex2;
pthread_cond_t cond;

int main(int argc,char ** argv)
{
   
int upBound;
   
int  i, j, k;
   
char result[20], *pStr;
    FILE
*fResult;
   
   
int thread_num=0;
    pthread_t threads[MAXThreadsNum];
   
double tcost;

    timeval start, end;

    gettimeofday(
&start, NULL);

   
for(i=1; i<argc; i++) {
        pStr
=strstr(argv[i], "-p=");
       
if ( pStr==NULL ) continue;
        sscanf(pStr,
"-p=%d", &thread_num);
    }
   
if(thread_num<2) {
        printf(
"Please input the number of threads to be created by specifying -p=num_of_threads, where num_of_threads is a integer greater than 1/n");
       
return 0;
    }
   
if(thread_num>MAXThreadsNum) thread_num = MAXThreadsNum;

//计算前 baseScope 个整数中的素数
    primes[0] = 2;
    totalPrimes
= 1;
    upBound
= baseScope;
   
if(upBound > search_scope_up_bound) upBound = search_scope_up_bound;

   
for(i=3; i<upBound+1; i+=2){  //从整数3开始检查 i 是否为素数
        for(k=0; primes[k]*primes[k]<i; k++// 依次检查 i 是否可以被前面的素数整除
              if( i % primes[k] == 0) break;
       
if(primes[k]*primes[k]>i){ // 如果 i 不能被前面的素数整除,
                                     
// 则将它作为新素数存入数组
               primes[totalPrimes] = i;
               totalPrimes
++;
        }
    }

//并行计算
    if (pthread_mutex_init(&mutex1,NULL)>0) printf("error in initializing mutex1/n");
   
if (pthread_mutex_init(&mutex2,NULL)>0) printf("error in initializing mutex2/n");
    pthread_cond_init(
&cond, NULL);
    unsearchedScope_low_bound
= baseScope+1;

//创建线程
    for(i=0; i<thread_num; i++)
        pthread_create(
&threads[i],NULL,searchPrimes,NULL);

//等待全部线程结束
    for(i=0; i<thread_num; i++)
        pthread_join(threads[i],NULL);

    pthread_mutex_destroy(
&mutex1);
    pthread_mutex_destroy(
&mutex2);
    pthread_cond_destroy(
&cond);

    gettimeofday(
&end, NULL);

//存储计算结果
    fResult=fopen("result_pThread_prime.txt", "wr");
   
for (i=0; i<totalPrimes; i++)    {
       
if (i%10 == 0 ) fputc('/n', fResult);
        sprintf(result,
"%d   ", primes[i]);
        fwrite(result,
sizeof(char), strlen(result), fResult);
    }
    fclose(fResult);

//输出时间开销
    tcost = end.tv_sec - start.tv_sec + (double)(end.tv_usec-start.tv_usec)/1000000.0;
    printf(
"pThread time is %f seconds, found %d primes and the results are saved in result_pThread_prime.txt/n/n", tcost, totalPrimes);

  
return(0);
}

void *searchPrimes(void *) {
   
int my_id, loc_low_bound, loc_up_bound, i, k;
   
int locPrimes[chunkSize];
   
int locTotal;
   
char log[128];

   
//开始搜索素数
    while(1) {
       
//取一个未搜索的片段
        pthread_mutex_lock(&mutex1);
        loc_low_bound
= unsearchedScope_low_bound;
        unsearchedScope_low_bound
+= chunkSize;
        my_id
= task_id;
        task_id
++;
        pthread_mutex_unlock (
&mutex1);
       
if( loc_low_bound > search_scope_up_bound ) break;

        loc_up_bound
= loc_low_bound + chunkSize;
       
if ( loc_up_bound > search_scope_up_bound ) loc_up_bound = search_scope_up_bound;
        locTotal
= 0;

       
//搜索片段内的素数
        for(i=loc_low_bound; i<loc_up_bound; i+=2){
       
// 依次检查 i 是否可以被前面的素数整除
            for(k=0; primes[k]*primes[k]<i; k++)
               
if( i % primes[k] == 0) break;
           
if(primes[k]*primes[k]>i){ // 如果 i 不能被前面的素数整除,则将它作为新素数存入数组
                  locPrimes[locTotal] = i;
                  locTotal
++
              }
        }

       
//将搜索到的素数存储到数组primes中
        pthread_mutex_lock (&mutex2);
       
while(my_id != result_id)
            pthread_cond_wait(
&cond, &mutex2);

       
for(i=0; i<locTotal; i++) {
            primes[totalPrimes]
= locPrimes[i];
            totalPrimes
++;
        }

        result_id
++;
        pthread_cond_broadcast(
&cond);
        pthread_mutex_unlock (
&mutex2);
    }

   
return((void*)NULL);
}

 


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
  • Linux 中使用 clone 函数来创建线程
    2019独角兽企业重金招聘Python工程师标准Linux上创建线程一般使用的是pthread库实际上libc也给我们提供了创建线程的函数那就是cloneintclone(i ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Python基础知识:注释、输出和input交互
    本文介绍了Python基础知识,包括注释的使用、输出函数print的用法以及input函数的交互功能。其中涉及到字符串和整数的类型转换等内容。 ... [详细]
  • KVC:Key-valuecodingisamechanismforindirectlyaccessinganobject’sattributesandrelations ... [详细]
  • Linux线程的同步和互斥
    目录1、线程的互斥2、可重入VS线程安全3、线程的同步1、线程的互斥 ... [详细]
  • java布尔字段用is前缀_POJO类中布尔类型的变量都不要加is前缀详解
    前言对应阿里巴巴开发手册第一章的命名风格的第八条。【强制】POJO类中布尔类型的变量都不要加is前缀,否则部分框架解析会引起序列化错误。反例:定义为基本 ... [详细]
author-avatar
李辰1990
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有