【发布时间】:2018-08-02 15:36:12
【问题描述】:
我的目标是创建一个程序来评估增加程序可以使用的线程数所带来的性能提升。我通过使用蒙特卡洛方法计算 pi 来评估性能。每个线程应创建 1 个随机坐标 (x,y) 并检查该坐标是否在圆内。如果是,inCircle 计数器应该增加。 Pi 计算如下:4 * inCircle/trys。使用pthread_join,在应该受益于多线程的问题中没有性能提升。有没有办法让多个线程增加一个计数器而不必等待每个单独的线程?
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <stdbool.h>
#include <pthread.h>
#define nPoints 10000000
#define NUM_THREADS 16
int inCircle = 0;
int count = 0;
double x,y;
pthread_mutex_t mutex;
bool isInCircle(double x, double y){
if(x*x+y*y<=1){
return true;
}
else{
return false;
}
}
void *piSlave(){
int myCount = 0;
time_t now;
time(&now);
srand((unsigned int)now);
for(int i = 1; i <= nPoints/NUM_THREADS; i++) {
x = (double)rand() / (double)RAND_MAX;
y = (double)rand() / (double)RAND_MAX;
if(isInCircle(x,y)){
myCount++;
}
}
pthread_mutex_lock(&mutex);
inCircle += myCount;
pthread_mutex_unlock(&mutex);
pthread_exit(0);
}
double piMaster()
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0; t<NUM_THREADS; t++){
printf("Creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, piSlave, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
//pthread_join(threads[t], NULL);
}
//wait(NULL);
return 4.0*inCircle/nPoints;
}
int main()
{
printf("%f\n",piMaster());
return(0);
}
【问题讨论】:
-
rand()不是线程安全的。您的程序无效。
标签: c multithreading pthreads mutex pthread-join