【问题标题】:POSIX pthread_create scrambles the values of variables in a struct, how to avoid that?POSIX pthread_create 打乱了结构中变量的值,如何避免这种情况?
【发布时间】:2017-05-26 17:57:55
【问题描述】:

所以我的程序在这里:

#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 启动时会吐出垃圾?有办法解决吗?

【问题讨论】:

  • input中数组的分配大小在哪里指定??
  • 哦,我现在明白了。所以我必须在使用pthread时实际声明数组的大小?我已将int array[]; 更改为int array[size];,似乎我得到了正确的结果。这是正确的做法吗?我注意到如果我增加数组大小,程序会引发分段错误。非常感谢您的回答。
  • “所以我在使用pthread时必须实际声明数组的大小?”你总是必须指定它。 int array[]; 之类的东西只能作为函数参数有效。
  • 感谢@latedeveloper 的回复。我已经更改了所有数组声明,以确保它们包含预期的大小并且我的程序运行正常。非常感谢你们的帮助!
  • 您应该在使用任何数组之前声明它的大小。令我惊讶的是,即使没有其他线程,您的代码也不会崩溃。

标签: c++ multithreading concurrency pthreads posix


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多