-1

我正在做线程编程并尝试实现 MonteCarlo 技术来计算其中的 Pi 值。我编译了代码并且我没有错误但是当我执行时我没有得到它的输出。如果有任何错误,请纠正我。

这是我的代码:

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

#define frand() ((double) rand() / (RAND_MAX))
#define MAX_LEN 1353
const size_t N = 4;
float circlePoints=0;
void* point_counter(void *param){
    float xcord; 
    float ycord; 
    while(MAX_LEN){

        xcord=frand();
        ycord=frand();
        float cord = (xcord*xcord) + (ycord*ycord);

        if(cord <= 1){
            circlePoints++;}
    }
}

int main()
{
    printf("out");
    size_t i;
    pthread_t thread[N];

    srand(time(NULL));
    for( i=0;i <4;++i){
        printf("in creating thread");
        pthread_create( &thread[i], NULL, &point_counter, NULL);
    }
    for(i=0;i <4;++i){
        printf("in joining thread");
        pthread_join( thread[i], NULL );
    }
    for( i=0;i <4;++i){
        printf("in last thread");
        float pi = 4.0 * (float)circlePoints /MAX_LEN;

        printf("pi is %2.4f: \n", pi);
    }
    return 0;
}
4

3 回答 3

4

你在这里遇到了一个无限循环:

while(MAX_LEN){

因为MAX_LEN是并且保持非零。

至于为什么在此之前看不到输出,请参阅为什么 printf 在调用后不刷新,除非换行符在格式字符串中?

于 2013-10-13T08:15:20.237 回答
2

您的线程函数中有一个无限循环:

while(MAX_LEN){
   ...
}

因此,您创建的所有线程都不会出现在该循环中。

此外,circlePoints被所有线程修改,这将导致竞争条件什么是竞争条件?)并可能使值不正确。您应该使用互斥锁来避免它。

于 2013-10-13T08:16:29.237 回答
1
while(any_non_zero_number_which does_not_update)
{
    infinite loop            //not good unless you intend it that way
}
于 2013-10-13T08:17:52.253 回答