Можете ли вы вызвать qsort для секции массива / матрицы (основной порядок строк)?

Можете ли вы вызвать qsort для секции массива или матрицы в главном порядке строк?

Я хотел бы вызвать qsort для отдельных частей массива в pthreads, этот поток безопасен и нормально делать?

Я работаю над разделением данного массива или матрицы по количеству потоков или ядер, заданных в качестве глобальной переменной n_threads и затем вызывая qsort для каждого раздела в той же памяти массивов. Я хочу использовать начальное значение и итоговые значения, чтобы получить начальный и конечный индекс функции qsort.

// @Return - returns a comparison function for quicksort
int cmp_func (const void * a, const void * b) {
    return ( *(float*)a - *(float*)b );
}

// struct used for passing arguments from merge_sort to merge_sort recursively
typedef struct {
    float* m;
    size_t t_id;
} t_arg_sort;

// Initalises a new sorted matrix within threads.
static void* pthread_sorted(void* arg) {
    t_arg_sorted* t_arg = (t_arg_sorted*) arg;
    const size_t start = t_arg->t_id * (n_elements/n_threads);
    qsort(t_arg->r + start, (n_elements/n_threads), sizeof(float), cmp_func);
    return NULL;
}

// Sorts matrix
float* sorted(const float* matrix) {
    float* new_matrix = new_matrix();

    t_arg_sort thread_args[n_threads];
    for (size_t i = 0; i < n_threads; i++) {
        thread_args[i] = (t_arg_sort) {
            .m = new_matrix,
            .t_id = i
        };
    }

    // create threads to sort matrix
    pthread_t threads[n_threads];
    for (size_t i = 0; i < n_threads; i++) {
        if(pthread_create(threads + i, NULL, pthread_reversed, thread_args + i) != 0) {
            perror("Create thread failed!\n");
            return 1;
        }
    }

    // join threads after all coordinates have been initialised
    for (size_t i = 0; i < n_threads; i++) {
        if (pthread_join(threads[i], NULL) != 0) {
            perror("Join thread failed!\n");
            return 1;
        }
    }

    qsort(new_matrix, g_elements, sizeof(float), cmp_func);

    return new_matrix;
}

0 ответов

Другие вопросы по тегам