我正在进行线程编程并尝试实现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;
}
答案 0 :(得分:4)
你在这里遇到了无限循环:
while(MAX_LEN){
由于MAX_LEN
是并且仍为非零。
至于为什么在之前没有看到输出,请参阅Why does printf not flush after the call unless a newline is in the format string?
答案 1 :(得分:2)
你的线程函数中有一个无限循环:
while(MAX_LEN){
...
}
所以你创建的所有线程都不会出现那个循环。
此外,circlePoints
会被导致竞争条件( what's a race condition? )的所有线程修改,并可能导致值不正确。你应该使用互斥锁来避免它。
答案 2 :(得分:1)
while(any_non_zero_number_which does_not_update)
{
infinite loop //not good unless you intend it that way
}