这里用的是信号量
有需求可以改成其他的
首先要新开一个桶存起来,然后得到资源在写进结果数组
如果不这样多核会比单核还慢,因为写操作并没有优化
然后我这里用了map,如果桶编号大,每个核心结果离散度比较大时,用数组会慢很多,map在离散度大的时候不怎么受影响
#include<iostream>
#include<unistd.h>
#include <pthread.h>
#include <string.h>
#include <map>
#include <semaphore.h>
#include <ctime>
#include<math.h>
using namespace std;
int thread_number;
int number;
int mp_number;
int value[1000010];
map<long long,long long> id_to_thread;
map<long long,long long> thread_to_id;
int mn,mx;
int mp[1000010];
int randab(int a,int b){
return (rand()%(b-a+1))+a;
}
pthread_mutex_t mutex;
sem_t semp;
void *cal(void* arg){
int id=thread_to_id[pthread_self()];
int start=1+(id-1)*(number/thread_number);
int fina=id*(number/thread_number);
if(id==thread_number){
fina=number;
}
map<int,int> temp;
for(int i=start;i<=fina;++i){
temp[min(mp_number,(randab(mn,mx)-mn)/((mx-mn+1)/mp_number)+1)]++;
}
sem_wait(&semp);
for(auto t:temp){
mp[t.first]+=t.second;
}
sem_post(&semp);
return NULL;
}
int main(){
sem_init(&semp,0,1);
pthread_t p1[100];
pthread_mutex_init(&mutex,NULL);
cout<<"线程数量,数据数量,桶数量, 数据最小值,数据最大值\n";
cin>>thread_number>>number>>mp_number>>mn>>mx;
clock_t begin, end;
begin = clock();
for(int i=1;i<=thread_number;++i){
pthread_create(&p1[i],NULL,cal,NULL);
thread_to_id[p1[i]]=i;
}
for(int i=1;i<=thread_number;++i){
pthread_join(p1[i],NULL);
}
end = clock();
cout << "所用时间:" << double(end - begin) / CLOCKS_PER_SEC*1000 << "ms" << endl;
for(int i=1;i<=mp_number;++i){
int start=mn+(i-1)*((mx-mn+1)/mp_number);
int fina=mn+i*((mx-mn+1)/mp_number)-1;
if(i==mp_number) fina=mx;
cout<<start<<"--"<<fina<<" : ";
cout<<mp[i]<<endl;
}
cout<<endl;
sem_destroy(&semp);
pthread_mutex_destroy(&mutex);
return 0;
}