POSIX pthread_create对结构中的变量值进行打乱,如何避免这种情况

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

本文关键字:何避免 情况 create pthread 结构 变量值 POSIX      更新时间:2023-10-16

所以我在这里有我的程序:

#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(); 创建一个负责执行该函数的新线程时,测试循环会吐出废话和一些随机的大数字,每次都不同。

有点奇怪,因为代码以任何一种方式编译,从字面上看,我唯一更改的是这 2 行。

我做错了什么,为什么函数在 Pthread 启动时会吐出垃圾?有没有办法解决它?

好的,

如果有人遇到类似的问题:

无论如何都要声明数组的大小。事实证明,我的程序无法正常工作,因为我将结果数组初始化为 float result1[]; 而不是float result1[size];

相关文章: