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();
创建一个负责执行该函数的新线程时,测试循环会吐出废话和一些随机的大数字,每次都不同。
有点奇怪,因为代码以任何一种方式编译,从字面上看,我唯一更改的是这 2 行。
我做错了什么,为什么函数在 Pthread 启动时会吐出垃圾?有没有办法解决它?
好的,
如果有人遇到类似的问题:
无论如何都要声明数组的大小。事实证明,我的程序无法正常工作,因为我将结果数组初始化为 float result1[];
而不是float result1[size];
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- 使用 std::istream_iterator 时,它似乎跳过了空文件行 - 如果可能的话,如何避免这种情况?
- C++待办事项列表重复输入.如何避免这种情况?
- C++ 模板类:运行时给出的模板参数,如何避免重复大开关情况?
- 在这种情况下,我可以避免使用带有主体的纯虚函数吗?
- lower_bound 在 C++ STL 中返回迭代器,即使元素不存在也是如此.如何避免这种情况?
- 为什么我可以在不链接任何额外库的情况下包含 sys/*.h
- 应由于计算费用而避免对STD的多个调用::发现,否则这是可以接受的情况
- 如何避免字符串到整数转换情况下的无效参数异常
- 在没有互斥锁的情况下重新计数时如何避免竞争条件?
- 在这种情况下是否可以避免使用虚拟方法调用?
- 具有空参数包的递归可变参数模板(以避免基本情况的重复)
- 我可以在不使用原始指针的情况下避免在std :: pinitializer_list的Intialization过程中复
- 随机洗牌似乎会产生相同的结果,但仅在前两个实例中产生相同的结果.我如何避免这种情况
- POSIX pthread_create对结构中的变量值进行打乱,如何避免这种情况
- Qt:避免在字符串更改的情况下重建应用程序
- 是否有应该避免使用constexpr的情况,即使它可以被使用?
- 如何在不创建空类的情况下避免"big"模板类的专用化?
- 字体在Windows 8上变小 - 在C++/MFC程序中.如何避免这种情况