簡體   English   中英

如何在pthread線程中創建memcpy?

[英]How to make a memcpy inside of an thread of pthread?

我正在嘗試使用c ++中的pthreads做2個矩陣的總和。 我一直試圖將線程內部計算的總和的結果傳遞給我的主函數。

要添加的2個值在結構內部:

struct sum{
    int value1;
    int value2;
    int result;
}typedef struct_sum;

並將包含值的結構作為參數傳遞給pthread_create()以便在線程內部執行操作。

這是我的例程:

void * routine(void * sum) {
    std::cout<<((struct_sum *)sum)->value1 + ((struct_sum *)sum)->value2<<std::endl;
    std::cout<<((struct_sum *)sum)->value1<<std::endl;
    std::cout<<((struct_sum *)sum)->value2<<std::endl;
    int i = (((struct_sum *) sum)->value1 + ((struct_sum *) sum)->value2);
//    memcpy(&(((struct_sum *)sum)->result), reinterpret_cast<const void *>(i), sizeof(i));
    ((struct_sum *)sum)->result = i;
    std::cout<<&(((struct_sum *)sum)->result)<<std::endl;
    pthread_exit(nullptr);
}

在前3個cout我檢查我的值是否正確到達線程。 在最后一個cout (退出線程之前),我檢查了結構的result元素的內存地址(因此,我可以看到它在main函數中具有相同的地址)。

主要功能如下:

int main(int argc, char * argv[]) {
    int mat_1[ROW_SIZE][COLUMN_SIZE] = {{1, 2},
                                        {6, 7}};
    int mat_2[ROW_SIZE][COLUMN_SIZE] = {{3, 15},
                                        {9, 14}};
    int mat_result[ROW_SIZE][COLUMN_SIZE];
    int mat_size = sizeof(mat_1) / sizeof(int);
    int row_size = sizeof(mat_1) / sizeof(mat_1[0]);
    int column_size = sizeof(mat_1[0]) / sizeof(int);
    pthread_t threads[mat_size];
    int thread_number = 0;
    int thread_handler;
    for (int row = 0; row < row_size; row++) {
        for (int column = 0; column < column_size; column++) {
            struct_sum *result;
            result = static_cast<struct_sum *>(malloc(sizeof(struct_sum)));
            result->value1 = mat_1[row][column];
            result->value2 = mat_2[row][column];
            result->result = 0;
            thread_handler = pthread_create(&threads[thread_number], nullptr, routine, result);
            if(thread_handler) return(-1);
            std::cout << &(result->result)<<std::endl;
            thread_number++;
            mat_result[row][column] = result->result;
//            free(result);
        }
    }
    pthread_exit(nullptr);
}

我有兩個問題:

  1. 即使結果在主線程和線程中具有相同的地址,當我將i的值復制到main函數中的((struct_sum *)sum)->result((struct_sum *)sum)->result result->result仍為0。

  2. 當我取消對memcpy()行的注釋時,線程根本不會運行,所以我不知道我做錯了什么。

我期望在我的main功能中,語句std::cout << (result->result) <<std::endl將返回操作結果,但當前值為0。

那么,如何在線程中正確執行memcpy()

您必須加入線程。 這意味着,等待他們完成。 您的工作方式基本上是啟動線程,而不給它保證的時間做任何事情。 除此之外,對API進行了一些重要更改,請檢查以下注釋:

void * routine(void * sum) {
    int i = (((struct_sum *) sum)->value1 + ((struct_sum *) sum)->value2);
    ((struct_sum *)sum)->result = i;

    // notice you don't need memcpy(), in fact...
    // but you could use it here if you want... it won't fail.

    // you have to use this function so it return your result to the main thread.
    pthread_exit(sum);
}

int main(int argc, char * argv[]) {
    int mat_1[ROW_SIZE][COLUMN_SIZE] = {{1, 2},
                                        {6, 7}};
    int mat_2[ROW_SIZE][COLUMN_SIZE] = {{3, 15},
                                        {9, 14}};
    int mat_result[ROW_SIZE][COLUMN_SIZE];
    int mat_size = sizeof(mat_1) / sizeof(int);
    int row_size = sizeof(mat_1) / sizeof(mat_1[0]);
    int column_size = sizeof(mat_1[0]) / sizeof(int);
    pthread_t threads[mat_size];
    int thread_number = 0;
    int thread_handler;
    for (int row = 0; row < row_size; row++) {
        for (int column = 0; column < column_size; column++) {
            struct_sum *result;
            result = static_cast<struct_sum *>(malloc(sizeof(struct_sum)));
            result->value1 = mat_1[row][column];
            result->value2 = mat_2[row][column];
            result->result = 0;
            thread_handler = pthread_create(&threads[thread_number], nullptr, routine, result);
            if(thread_handler) return(-1);
            // std::cout << &(result->result)<<std::endl;
            thread_number++;
            // forget this line below
            // mat_result[row][column] = result->result;
        }
    }

    // here you wait for the threads to JOIN
    // here it means they actually "finished" their job
    for (int i = 0; i < mat_size; i++)
    {
        struct_sum *result;

        // here you wait for the threads to finish their job
        // add something to your struct to "identify" the thread, so
        // you can figure out where in the final matrix you put the result
        pthread_join(threads[i], (void**)&result);
        std::cout << result->result << "\n";

        // this will print the correct sums: 4, 17, 15 and 21
        // notice: it will be printed in ANY order, once you
        // don't know which thread will finish first
        // but result->result has the... result you need!
        // you have to figure out how to fit this result in your matrix.
        // but this is out of scope of the question
        // and you can do yourself. have fun! :-)

        // here you can free the result, you already got the value!
        free(result);
    }

    // you don't need this line below... this goes to routine()
    // pthread_exit(nullptr);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM