我正在尝试使用 10 个线程对长度为 1000 的数组进行排序。第一个线程是 0 到 99,第二个是 100 到 199 ....我的问题是只有前 100 个元素被排序,其余的元素保持不变,即使线程在排序以外的所有方面都按预期运行。
#define N 1000
int arr[N];
int main(int argc, char *argv[])
{
int i;
//Filling the array with random integers
for(i=0;i<N;i++)
{
arr[i]=1+rand()%200;
}
for(i=0;i<N;i++)
{
printf("%d | ",arr[i]);
}
printf("\n");
/* START OF THREAD SECTION */
pthread_t sorters[10];
for(i=0;i<10;i++)
{
pthread_create(&sorters[i],NULL,sortArr,(void*)i);
pthread_join(sorters[i],NULL);
}
/* END OF THREAD SECTION */
return 0;
}
主题:
void* sortArr(void *num)
{
int i,j,temp,cast,first=0,last;
//Casting
cast=(intptr_t)num;
//Calculating first and last element
first=(cast*100);
last=first+99;
printf("first %d , last %d \n",first,last);
printf("Not sorted:\n");
for(i=first;i<last;i++)
{
printf("%d | ",arr[i]);
}
printf("\n");
/* SORTING */
for (i = first; i < last-1; i++)
{
for (j = first; j < last-i; j++)
{
if (arr[j] > arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
/* SORTING */
printf("Sorted:\n");
for(i=first;i<last;i++)
{
printf("%d | ",arr[i]);
}
printf("\n");
}
以我目前的知识,我只能尝试很多事情来弄清楚,任何帮助将不胜感激。
最佳答案
如果 first
不为 0,则内部循环退出条件使其立即退出。应该是
for (j = first; j < last + first - i; j++)
另外,这 10 个线程毫无意义,因为它们不是并行运行的。您应该将连接移动到单独的循环中。
关于c - 线程只会对数组的第一个分区进行排序(冒泡排序,Pthread),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49906422/