如何使用线程调试此 C 代码,以及如何解决该问题

问题描述 投票:0回答:1

这是代码:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>

void display(int *arr, int size) {
    int i;
    for(i=0; i<size; i++)
        printf("%d ", arr[i]);

    printf("\n");
}

void display2(int *arr, int size) {
    int i;
    for(i=1; i<size; i++)
        printf("%d ", arr[i]);
        
    printf("\n");
}


void mergeA(int* arr, int lb, int ub, int mid) {
//  printf("Inside mergeA\n");
    int i=lb, j=mid+1, k=lb;
    int newarr[1000];

    while(i<=mid && j<=ub) {
        if(arr[i] > arr[j])
            newarr[k++] = arr[j++];
        else
            newarr[k++] = arr[i++];
    }
    
    for(; i<=mid; i++)
        newarr[k++] = arr[i];
    for(; j<=ub; j++)
        newarr[k++] = arr[j];

    for(i=lb; i<=ub; i++)
        arr[i] = newarr[i];
}
void mergeD(int* arr, int lb, int ub, int mid) {
//  printf("Inside mergeD\n");
    int i=lb, j=mid+1, k=lb;
    int newarr[1000];

    while(i<=mid && j<=ub) {
        if(arr[i] < arr[j])
            newarr[k++] = arr[j++];
        else
            newarr[k++] = arr[i++];
    }
    
    for(; i<=mid; i++)
        newarr[k++] = arr[i];
    for(; j<=ub; j++)
        newarr[k++] = arr[j];

    for(i=lb; i<=ub; i++)
        arr[i] = newarr[i];
}


void mergeSortA(int* arr, int lb, int ub) {
//  printf("Inside mergeSortA\n");
    if(lb<ub) {
        int mid = (lb+ub)/2;
        mergeSortA(arr, lb, mid);
        mergeSortA(arr, mid+1, ub);
        mergeA(arr, lb, ub, mid);
    }
}

void mergeSortD(int* arr, int lb, int ub) {
//  printf("Inside mergeSortD\n");
    if(lb<ub) {
        int mid = (lb+ub)/2;
        mergeSortD(arr, lb, mid);
        mergeSortD(arr, mid+1, ub);
        mergeD(arr, lb, ub, mid);
    }
}

void* sort_a(void* args) {
    int* arr = (int*)malloc(sizeof(int)*1000);
    arr = (int*)args;
    int size = arr[0];

    printf("Inside Sort A: ");
    display2(arr, size);
    
    mergeSortA(arr, 1, size-1);
    printf("After Sort A: ");
    display2(arr, size);
    pthread_exit((void*)arr);
}

void* sort_d(void* args) {
    int* arr = (int*)malloc(sizeof(int)*1000);
    arr = (int*)args;
    int size = arr[0];

    printf("Inside Sort D: ");
    display2(arr, size);
    
    mergeSortD(arr, 1, size-1);
    printf("After Sort D: ");
    display2(arr, size);
    pthread_exit((void*)arr);
}

int main() {
    pthread_t t1, t2;
    int arr[1000];
    int i=0, j, k1=1, k2=1;

    //Taking the array as input
    while(1) {
        printf("Enter an element or 'quit' to stop input: ");
        
        char input[100];
        scanf("%s", input);

        if(strcmp(input, "quit") == 0)
            break;

        arr[i++] = atoi(input);
    }
    printf("The Array:\n");
    display(arr, i);

    //Spliting the array into two
    int arr1[1000], arr2[1000];
    for(j=0; j<i; j++) {
        if(j<i/2)
            arr1[k1++]=arr[j];
        else
            arr2[k2++]=arr[j];
    }
    //Storing size in index 0
    arr1[0] = k1;
    arr2[0] = k2;

    //Creating the threads
    pthread_create(&t1, NULL, &sort_a, (void*)arr1);
    pthread_create(&t2, NULL, &sort_d, (void*)arr2);

    //Joining the threads
    pthread_join(t1, (void*)arr1);
    pthread_join(t2, (void*)arr2);

    //After Sorting
    printf("Main Thread:\n");
    display2(arr1, k1);
    display2(arr2, k2);
}

我希望输出与函数(sort_a 和 sort_d)中的输出相同,但第一个索引中的元素始终是垃圾值。 注意:本例中的第一个索引是 1,因为我已将长度存储在第 0 个索引中

Output Image

如您所见,主线程中的输出不正确。

c multithreading mergesort
1个回答
0
投票

在 MergeD 中,比较应该是:

        if(arr[i] > arr[j])    /* not if(arr[i] < arr[j]) */

sort_a 和 sort_d malloc 数组,但永远不要释放它们。他们应该释放分配的内存。两个合并函数都应该使用 malloc,而不是使用大小为 1000 的本地数组,以便可以对更大的数组进行排序。

两个线程完成后,需要进行最后的合并。


两个线程不需要有一组单独的函数。

作为使用索引 0 作为数组大小的替代方法,pthread_create 可以将指向结构的指针作为参数传递,其中该结构将包含指向数组中元素的指针和大小。

© www.soinside.com 2019 - 2024. All rights reserved.