簡體   English   中英

POSIX pthread_create對結構中的變量值進行加擾,如何避免這種情況?

[英]POSIX pthread_create scrambles the values of variables in a struct, how to avoid that?

所以我的程序在這里:

#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include <math.h>
#include <stdlib.h>

using namespace std;

int const size = 3;


struct Arguments{
    int array[];
    float result1[];
    float result2[];
};


//void calc(int arr[], float rarr1[], float rarr2[], int size);
void* calc(void *param);

int main(int argc, char *argv[]){



    time_t t;
    srand((unsigned) time(&t));

    int arr[size][size] = {};
    float rarr1[size][size-1] = {};
    float rarr2[size][size-1] = {};

    for(int x = 0; x < size; x++){
        for(int y = 0; y < size; y++){
            int number = rand()%10;
            arr[x][y] = number;
        }
    }

    for(int x = 0; x < size; x++){
        for(int y = 0; y < size; y++){
            cout << arr[x][y] << " ";
        }
        cout << endl;
    }

    cout << endl;

/////////////////////////////////////////

    pthread_t child;

    struct Arguments input;

    for(int i = 0; i < size; i++){

        input.array[i] = arr[0][i];
    }

    pthread_create(&child, NULL, calc, (void*)&input);
    pthread_join(child, NULL);

    //calc(&input);

    for(int i = 0; i < size-1; i++){
        rarr1[0][i] = input.result1[i];
        cout << "Test: " << rarr1[0][i] << endl;   
    }

//////////////////////////////////


    return 0;
}

//void calc(int arr[], float rarr1[], float rarr2[], int size){

void* calc(void *param){

    struct Arguments *input = (struct Arguments*)param;

    int arr1[] = {};

    float rarr1[] = {};
    float rarr2[] = {};

    for(int i = 0; i < size; i++){

        arr1[i] = input->array[i];
    }

    for(int i = 0; i < size; i++){
            int a = arr1[i];
            int b = arr1[i+1];

            int difference = a-b;

            if(difference < 0){
                difference = difference * -1;
            }

            float euc = 1 + pow(difference, 2);
            euc = sqrt(euc);

            rarr1[i] = euc;
    }

    for(int i = 0; i <size-1; i++){
        input->result1[i] = rarr1[i];
    }

    for(int i = 0; i <size-1; i++){

        int a = arr1[i];
        int b = arr1[i+1];

        int difference = a-b;

        if(difference < 0){
            difference = difference * -1;
        }

        float apar = (difference/rarr1[i]);

        float result = asin(apar);
        result = result*(180/3.14);

        rarr2[i] = result;
    }

    return NULL;

}

引起麻煩的重要部分在//////行之間,但是我將其余代碼留給了上下文,因為它可能很有用。

所以我有函數calc(param); 在程序中進行重要的計算。

只要我自己調用它(通過在代碼中實際包含函數調用)並在給出正確結果后立即進行測試循環,它就可以正常工作。

但是,當我嘗試使用pthread_create(); 為了創建一個新線程來執行該函數,測試循環會吐出廢話,並且每次都會隨機產生一些隨機數。

這有點奇怪,因為代碼會以任何一種方式進行編譯,而實際上我唯一要更改的是這兩行。

我在做什么錯?為什么該函數在由Pthread啟動時會吐出垃圾? 有辦法解決嗎?

好吧,如果有人遇到類似的問題:

無論如何,聲明數組的大小。 事實證明,我的程序無法正常運行,因為我將結果數組初始化為float result1[]; 而不是float result1[size];

暫無
暫無

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

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