Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的mergesort使用线程比不使用线程慢?_C_Multithreading_Mutex_Mergesort - Fatal编程技术网

C 为什么我的mergesort使用线程比不使用线程慢?

C 为什么我的mergesort使用线程比不使用线程慢?,c,multithreading,mutex,mergesort,C,Multithreading,Mutex,Mergesort,我是一名学生,需要使用threads和fork()在C中实现Mergesort程序。没有并行化的实施是由学校助理预先制定的。到目前为止,我实现了线程并行化,但是程序比没有线程运行要慢得多 我通过以下方式从预制文件中读取数字和测量时间: $ time cat rand_stevila.bin | ./mergeSort 10000 当我使用线程订购时,我使用以下线程运行: $ time cat rand_stevila.bin | ./mergeSort 10000 -t #包括 #包括 #包

我是一名学生,需要使用threads和fork()在C中实现Mergesort程序。没有并行化的实施是由学校助理预先制定的。到目前为止,我实现了线程并行化,但是程序比没有线程运行要慢得多

我通过以下方式从预制文件中读取数字和测量时间:

$ time cat rand_stevila.bin | ./mergeSort 10000
当我使用线程订购时,我使用以下线程运行:

$ time cat rand_stevila.bin | ./mergeSort 10000 -t
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效打印帮助(int argc,char**argv);
void submergeSortSimple(int*array,int min1,int max1,int min2,int max2);
void submergeSortProc(int*数组、int min1、int max1、int min2、int max2);
void submergeSortThread(int*array,int min1,int max1,int min2,int max2);
void合并排序(int*数组、int最小值、int最大值、void(*子合并排序)(int*、int、int、int、int、int));
无效合并(int*arr、int-min、int-mid、int-max);
int max_paralelizacij;
pthread\u mutex\u t mtx=pthread\u mutex\u初始值设定项;
结构{
int*数组;
int-min;
int max;
void(*函数)(int*,int,int,int,int);
}类型定义线程参数;
void*thread\u fun(void*args){
thread_args*thr_arg=(thread_args*)args;
合并排序((*thr_arg).array、(*thr_arg).min、(*thr_arg.max、(*thr_arg.function);
返回0;
}
//实施前合并,
//德斯诺·波洛维科的萨莫·克里切莫·玛格丽索特·萨莱沃
//v istem procesu/isti niti
void submergeSortSimple(int*数组、int min1、int max1、int min2、int max2){
合并排序(数组、min1、max1、submergeSortSimple);
合并排序(数组、min2、max2、submergeSortSimple);
}
//TODO:funkcija ki paralelizira sortiranje z uporabo procesov
//前总统萨莫·伊兹维德莫(samo izvedemo)与克里奇(klic)合并
//funkcije诉svojem procesu案,在扎克尔朱伊塔东南部的počakamo
void submergeSortProc(int*数组、int min1、int max1、int min2、int max2){
printf(“implementacija submergeSortProc manjka\n”);
返回;
}
//TODO:funkcija,我是paralelizira sortiranje z uporabo niti
//前总统萨莫·伊兹维德莫(samo izvedemo)与克里奇(klic)合并
//funkcije诉svoji niti案,在扎克尔朱托东南部的波卡莫
void submergeSortThread(int*数组、int min1、int max1、int min2、int max2){
pthread_t tid1,tid2;
线程参数arg1、arg2;
arg1.array=数组;
arg1.min=min1;
arg1.max=max1;
arg1.function=submergeSortThread;
arg2.array=数组;
arg2.min=min2;
arg2.max=max2;
arg2.function=submergeSortThread;
pthread_create(&tid1,0,&thread_fun,&arg1);
pthread_join(tid1,NULL);
pthread_create(&tid2,0,&thread_-fun,&arg2);
pthread_join(tid2,NULL);
返回;
}
//merge funkciji中的mergeSort
//ti dve izvajata dejansko sortiranje
//void合并排序(int*数组,int最小值,int最大值,void(*子合并排序)(int*,int,int,int,int))
//
//int*数组
//kazalec na tabeloštevil,ki jih urejamo
//
//最小整数,最大整数
//在zadnjegaštevila v tabeli案中的indeks prvega案,
//označujeta间隔,ki ga sortiramo
//
//void(*submergeSort)(int*数组、int min1、int max1、int min2、int max2)
//kazalec na funkcijo,ki naj kliče mergeSort za dva podintervala
//在vrne,ko sta oba intervala Sorritana
void合并排序(int*数组,int最小值,int最大值,void(*子合并排序)(int*,int,int,int,int)){
int mid;
如果(最小值<最大值){
中间=(最小+最大)/2;
浸没排序(数组、最小值、中间值、中间值+1、最大值);
合并(数组、最小值、中间值、最大值);
}
}
//无效合并(int*arr、int-min、int-mid、int-max)
// 
//int*arr
//卡扎莱克纳塔贝洛酒店
//
//最小整数,中间整数,最大整数
//这是一个很好的例子
//我在扎切特尼省,我在扎德尼省
//在max je zadnji indeks druge podtabele中添加podtabele
// 
//梅托达·兹德鲁齐·索蒂拉尼·波德塔贝利,
//塔科·达耶·诺瓦·波德塔贝拉·图迪·索地拉那酒店
无效合并(int*arr、int-min、int-mid、int-max){
//drugi-korak算法
int*tmp=malloc((最大-最小+1)*sizeof(int));
int i,j,k,m;
j=最小值;
m=mid+1;

对于(i=min;j您创建了多个线程,但不允许它们并行运行:您应该更改
submergeSortThread
以对线程创建进行分组,并将等待移动到末尾:

pthread_create(&tid1, 0, &thread_fun, &arg1);
pthread_create(&tid2, 0, &thread_fun, &arg2);
pthread_join(tid1, NULL); 
pthread_join(tid2, NULL); 
如果您为非常小的任务创建线程,那么程序可能仍然会变慢,因为在并行执行的好处面前,线程创建的开销变得非常大。创建的线程数应该比系统中的内核数少,因为只有这么多线程可以并行执行(在最好的情况下)


最后,您应该确保不同的线程不会同时访问相同的数据,从而避免使用互斥锁。这些
pthread\u mutex\u lock(&mtx);
/
pthread\u mutex\u unlock(&mtx)的开销
对是重要的。

在两个
pthread\u create
调用之间有一个
pthread\u join
。从:“pthread\u join()函数等待线程指定的线程终止”。这意味着在第一个线程退出之前不会创建第二个线程。这就是为什么需要一个。您需要将您的问题提取出来以关注问题。我如何确保线程不会在不使用互斥锁的情况下同时访问相同的数据?@AljažGornik:通过为线程分配数组和临时数组的单独部分。您可以n通过在临时数组中使用与要排序的数组中相同的偏移量来实现。