【发布时间】:2021-04-19 21:51:34
【问题描述】:
所以我有一个快速排序算法,我想在两个不同的线程中运行,这个想法是让数组的 2 个独立的一半被一次排序(这不应该是分区的快速排序性质的问题)。
我的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void troca (int *v, int i, int j);
int partition (int *v, int ini, int fim);
void quicksort (int *v, int ini, int fim, int size);
typedef struct {
int ini, mid, fim;
} thread_arg;
int size;
int *v;
void *thread_func(void* arg){
thread_arg *a = arg;
quicksort(v, a->ini, a->mid, a->fim);
printf("done in\n");
return NULL;
}
int main()
{
// initializations
scanf("%d", &size);
v = malloc(size * sizeof(int));
// read array
for (int i = 0; i < size; ++i)
scanf("%d", &v[i]);
// arguments
thread_arg argument1, argument2;
int mid = partition(v, 0, size-1);
argument1.ini = 0;
argument1.mid = mid-1;
argument1.fim = size;
argument2.ini = mid;
argument2.mid = size-1;
argument2.fim = size;
pthread_t thread1, thread2;
// thread and execution
pthread_create(&thread1, NULL, thread_func, &argument1);
printf("done out 1\n");
pthread_create(&thread2, NULL, thread_func, &argument2);
printf("done out 2\n");
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
free(v);
return 0;
}
void quicksort (int *v, int ini, int fim, int size){
if (ini >= fim)
return;
int meio = partition(v, ini, fim);
quicksort(v, ini, meio-1, size);
quicksort(v, meio+1, fim, size);
}
int partition (int *v, int ini, int fim){
int i = ini-1, j = ini;
troca(v, (ini+fim)/2, fim);
int pivo = v[fim];
for (; j < fim; ++j)
{
if (v[j] <= pivo)
{
i++;
troca(v, i, j);
}
}
troca(v, i+1, fim);
return i+1; //indice do pivo;
}
void troca (int *v, int i, int j){
int aux = v[i];
v[i] = v[j];
v[j] = aux;
return;
}
执行工作并完美排序,它确实生成了 2 个新的独立线程,每个线程对数组的一半进行排序。问题是,它不会同时进行。输入 100m 个随机数运行程序:
done out 1
done out 2
done in
done in
real 0m47,464s
user 0m50,686s
sys 0m0,452s
但是前 3 行出现大约需要 25 秒,最后一行大约需要 25 秒,这表明第二个线程正在等待第一个运行。
在htop 控制台中,似乎在某些时候两者同时运行(这是因为该程序运行速度比我的正常程序快一点)
最后,我知道同时处理这类数据是不安全的,但在这个排序示例中应该没问题。
【问题讨论】:
-
argument1.fim = size;应该是size / 2吗? -
@JohnnyMopp,这个大小不包括在排序中,它的目的只是不超过数组边界
-
你确定你运行它的机器/设置允许两个线程同时运行吗?
-
非常肯定,我在 Intel i5-3337U 四核上运行 Debian 10 buster。它会在短时间内显示在
htop上运行的所有 3 个进程
标签: c multithreading pthreads