gpt4 book ai didi

使用 pThreads 的 C 代码编译正常,但会出现段错误,使用 gdb 无济于事

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:44 25 4
gpt4 key购买 nike

您好,我正在尝试在 Mac 的终端中运行这段代码,它编译得很好,但是当我尝试执行它时出现段错误。当我运行 gdb 时,状态为无效内存地址 000000 或类似的东西。任何建议?先感谢您。

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>


#define MAX_THREADS 512

void *compute_pi( void * );


int sample_points;
int total_hits;
int total_misses;
int hits[ MAX_THREADS ];
int sample_points;
int sample_points_per_thread;
int num_threads;



int main( int argc, char *argv[] )
{
/* local variables */
int ii;
int retval;
pthread_t p_threads[MAX_THREADS];
pthread_attr_t attr;
double computed_pi;

/* initialize local variables */
retval = 0;


pthread_attr_init( &attr );
pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );

/* parse command line arguments into sample points and number of threads */
/* there is no error checking here!!!!! */
sample_points = atoi(argv[1]);
num_threads = atoi(argv[2]);

/* uncomment this block if you want interactive input!!!! */
/* if so...comment out the two statements above */
/*
printf( "Enter number of sample points: " );
scanf( "%d", &sample_points );
printf( "Enter number of threads: " );
scanf( "%d%", &num_threads );
*/

total_hits = 0;
sample_points_per_thread = sample_points / num_threads;

for( ii=0; ii<num_threads; ii++ )
{
hits[ii] = ii;
pthread_create( &p_threads[ ii ], &attr, compute_pi, (void *) &hits[ii] );
}

for( ii=0; ii<num_threads; ii++ )
{
pthread_join( p_threads[ ii ], NULL );
total_hits += hits[ ii ];
}

computed_pi = 4.0 * (double) total_hits / ((double) (sample_points));


printf( "Computed PI = %lf\n", computed_pi );


/* return to calling environment */
return( retval );
}


void *compute_pi( void *s )
{
int seed;
int ii;
int *hit_pointer;
int local_hits;
double rand_no_x;
double rand_no_y;

hit_pointer = (int *) s;
seed = *hit_pointer;
local_hits = 0;

for( ii=0; ii < sample_points_per_thread; ii++ )
{
rand_no_x = (double) (rand_r( &seed ))/(double)RAND_MAX;
rand_no_y = (double) (rand_r( &seed ))/(double)RAND_MAX;
if(((rand_no_x - 0.5) * (rand_no_x - 0.5) +
(rand_no_y - 0.5) * (rand_no_y - 0.5)) < 0.25)
local_hits++;
seed *= ii;
}

*hit_pointer = local_hits;
pthread_exit(0);
}

最佳答案

如果我使用 -ggdb 编译,在没有 cli args 的情况下在 GDB 中运行程序,我发现段错误在 atoi 中。查看代码,我看到:

sample_points = atoi(argv[1]);
num_threads = atoi(argv[2]);

不会通过检查 argc 来验证 argv[1]argv[2] 是否存在。

如果我用这个命令行运行:

 ./a.out 500 8

我得到这个结果:

  Computed PI = 2.616000

简而言之,我怀疑您运行的程序不正确,并且提供的不是很好。

关于使用 pThreads 的 C 代码编译正常,但会出现段错误,使用 gdb 无济于事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15345388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com