当前位置: 首页 > article >正文

编写Pthreads程序实现直方图统计

编写一个Pthreads程序实现直方图统计,选择使用忙等待、互斥量和信号量来保证临界区的互斥,并分析方法的优点和缺点。

互斥量

#include<iostream>
#include<fstream>
#include<pthread.h>
#include "time.h"
#define fer(i,a,b) for(int i=a;i<b;i++)
//#define int long long
using namespace std;

int thread_count;
pthread_mutex_t mutex[100];
const int N=1e6;
//生成数据,生成1e6个数据,分布在0~100中
void generate(int n){
    srand(0);
    ofstream outfile("data.xls");
    int x;
    fer(i,0,n){
        x=rand()%100;
        outfile<<x<<"\n";
    }
    outfile.close();
}
int res[100],Data[N],flag=0;
void* Thread_mutex (void* rank) {
	long my_rank = (long long) rank;
	int my_n = N / thread_count;//每个线程处理N/thread_count个数据
	int my_first_i = my_n * my_rank;
	int my_last_i = my_first_i + my_n;
    int i;
	for (i = my_first_i; i < my_last_i; i++) {
		pthread_mutex_lock (&mutex[Data[i]]);
		res[Data[i]]++;
		pthread_mutex_unlock (&mutex[Data[i]]);
	}
    cout<<"Thread"<<my_rank<<" has computed:"<<my_first_i<<"~"<<my_last_i<<endl;

	return NULL;
}

int main(int argc, char* argv[]){
    //2020030186
    //generate(N);
    clock_t start,end;

    ifstream infile("data.xls");
    fer(i,0,N){
        infile>>Data[i];
    }
    infile.close();
    int thread;
    pthread_t *thread_handles;
    thread_count = strtol(argv[1], NULL, 10);//从命令行读取线程数
    thread_handles = new pthread_t[thread_count];//分配长度
    
    fer(i,0,100){
        pthread_mutex_init(&mutex[i],NULL);
    }
    //创建进程
    start=clock();
    for(thread = 0; thread < thread_count; thread++){
		pthread_create(&thread_handles[thread], NULL, Thread_mutex, (void*)thread);
	}
    printf("Success\n");
    //合并线程
    for(thread = 0; thread < thread_count; thread++){
		pthread_join(thread_handles[thread], NULL);//合并线程
    }
    end=clock();
   	cout<<"\nruntime:"<< end-start;
    fer(i,0,100){
        pthread_mutex_destroy(&mutex[i]);
    }
    
    free(thread_handles);
    return 0;
}

忙等待

#include<iostream>
#include<fstream>
#include<pthread.h>
#include "time.h"
#define fer(i,a,b) for(int i=a;i<b;i++)
//#define int long long
using namespace std;

int thread_count;
//生成数据,生成1e6个数据,分布在0~100中
const int N=1e6;
void generate(int n){
    srand(0);
    ofstream outfile("data.xls");
    int x;
    fer(i,0,n){
        x=rand()%100;
        outfile<<x<<"\n";
    }
    outfile.close();
}
int res[100],Data[N],flag=0;
void* Thread_busy_waiting (void* rank) {
	long my_rank = (long long) rank;
	int my_n = N / thread_count;//每个线程处理N/thread_count个数据
	int my_first_i = my_n * my_rank;
	int my_last_i = my_first_i + my_n;
    int i;
	for (i = my_first_i; i < my_last_i; i++) {
		while (flag != my_rank );
		res[Data[i]]++;
		flag = (flag+1) % thread_count;
	}
    cout<<"Thread"<<my_rank<<" has computed:"<<my_first_i<<"~"<<my_last_i<<endl;

	return NULL;
}

int main(int argc, char* argv[]){
    //2020030186 zyq
    //generate(N);
    clock_t start,end;
    ifstream infile("data.xls");
    fer(i,0,N){
        infile>>Data[i];
    }
    infile.close();
    int thread;
    pthread_t *thread_handles;
    thread_count = strtol(argv[1], NULL, 10);//从命令行读取线程数
    thread_handles = new pthread_t[thread_count];//分配长度
    start=clock();
    //创建进程
    for(thread = 0; thread < thread_count; thread++){
		pthread_create(&thread_handles[thread], NULL, Thread_busy_waiting, (void*)thread);
	}
    printf("Success\n");
    //合并线程
    for(thread = 0; thread < thread_count; thread++){
		pthread_join(thread_handles[thread], NULL);//合并线程
    }
    end=clock();
   	cout<<"\nruntime:"<< end-start;
    free(thread_handles);
    return 0;
}

二元信号量

#include<iostream>
#include<fstream>
#include<pthread.h>
#include "time.h"
#include <semaphore.h>
#define fer(i,a,b) for(int i=a;i<b;i++)
//#define int long long
using namespace std;

int thread_count;
sem_t sem[100];
const int N=1e6;
//生成数据,生成1e6个数据,分布在0~100中
void generate(int n){
    srand(0);
    ofstream outfile("data.xls");
    int x;
    fer(i,0,n){
        x=rand()%100;
        outfile<<x<<"\n";
    }
    outfile.close();
}
int res[100],Data[N];
void* Thread_sem (void* rank) {
	long my_rank = (long long) rank;
	int my_n = N / thread_count;//每个线程处理N/thread_count个数据
	int my_first_i = my_n * my_rank;
	int my_last_i = my_first_i + my_n;
    int i;
	for (i = my_first_i; i < my_last_i; i++) {
		sem_wait(&sem[Data[i]]);
		res[Data[i]]++;
		sem_post(&sem[Data[i]]);
	}
    
    cout<<"Thread"<<my_rank<<" has computed:"<<my_first_i<<"~"<<my_last_i<<endl;

	return NULL;
}

int main(int argc, char* argv[]){
    //2020030186 zyq
    //generate(N);
    clock_t start,end;

    ifstream infile("data.xls");
    fer(i,0,N){
        infile>>Data[i];
    }
    infile.close();
    int thread;
    pthread_t *thread_handles;
    thread_count = strtol(argv[1], NULL, 10);//从命令行读取线程数
    thread_handles = new pthread_t[thread_count];//分配长度
    
    fer(i,0,100){
        sem_init(&sem[i], 0, 1); 
    }
    //创建进程
    start=clock();
    for(thread = 0; thread < thread_count; thread++){
		pthread_create(&thread_handles[thread], NULL, Thread_sem, (void*)thread);
	}
    printf("Success\n");
    //合并线程
    for(thread = 0; thread < thread_count; thread++){
		pthread_join(thread_handles[thread], NULL);//合并线程
    }
    end=clock();
   	cout<<"\nruntime:"<< end-start;
    fer(i,0,100){
        sem_destroy(&sem[i]);
    }
    free(thread_handles);
    return 0;
}

http://www.kler.cn/a/38006.html

相关文章:

  • Java设计模式之创建型-原型模式(UML类图+案例分析)
  • Ansible 自动化运维工具(完善版)
  • 让白嫖来的阿里云服务器来跑jupyter
  • Flutter ValueNotifier 监听数据变化
  • 论文阅读 HighlightMe: Detecting Highlights from Human-Centric Videos
  • wordpress仿站常用功能代码
  • HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(四)
  • Java Vue物联网系统
  • vagrant和vitrulBox创建虚拟机后使用xshell连接
  • Android 中利用多个Button组合实现选项切换效果
  • layui入门
  • AI辅助瞄准系统开发与实战(二)
  • 二级分销小程序怎么做
  • 【自我提升】JPA从搭建到CRUD快速入门(IDEA+MAVEN)
  • 【Linux系列P6】自动化构建工具-make/Makefile详解
  • 【跨平台开发】Uni-app原理分析
  • 安全启动相关命令使用
  • 网页无插件播放265/264视频/监控大屏/GPU解码
  • Win32 汇编在对话框上画线
  • 【Docker】Docker高级网络(NetWork)