Этот код указывается для задания. Тем не менее, с летучей мыши есть ошибка в вычислительной функции pi monte carlo. статистика ошибок недействительна для преобразования из int в unsigned int. Я не уверен, что это было предназначено, но я не смог исправить эту проблему. Эта функция является частью примера потоковой передачи, если вам интересно. Любые предложения больше всего оцененыНеверное преобразование int в unsigned int
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;//*error is these lines
rand_no_y = (double) (rand_r(&seed))/(double)RAND_MAX;//*error is these lines
if(((rand_no_x - 0.5) * (rand_no_x - 0.5) +
(rand_no_y - 0.5) * (rand_no_y - 0.5)) < 0.25)//*error
local_hits++;
seed *= ii;
}
*hit_pointer = local_hits;
pthread_exit(0);
}
Я сделал некоторую отладку и теперь вижу, где может быть ошибка. плохой пост теперь является главной функцией, в которой вызывается вычисление pi. Я считаю, что аргументы анализируются в точках выборки и количестве потоков. Когда я запускаю программу, она запрашивает ввод после этого, она терпит неудачу с сбоем сегрегации. Какие-либо предложения?
#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_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);
printf("Enter number of sample points: ");
scanf("%d", &sample_points);
printf("Enter number of threads: ");
scanf("%d%", &num_threads);
/* 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]);
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);
}
Предполагаемый или нет, исходное «исправление», по-видимому, связано с объявлением 'seed' в соответствии с типом придания предоставленного параметра' void * '' hit_pointer'. Этот «матч» переносится. Вы правы, что ['rand_r()'] (http://linux.die.net/man/3/rand_r) действительно специфицирует использование 'unsigned int *' как своего единственного параметра. – WhozCraig
Внимательно прочитайте сообщения об ошибках и не перефразируйте их. Ошибка: ** не ** недопустимое преобразование 'int' в' unsigned'; это нормально. Ошибка является недопустимым преобразованием 'int *' в 'unsigned *', что значительно отличается. –