【发布时间】:2017-11-09 06:54:10
【问题描述】:
我在 Ubuntu 上使用 Qt 并进行一项需要多次执行我的程序的研究测试。我决定使用线程来优化时间消耗,但是当参数很大时我遇到了问题。首先,我认为这是线程或对象编程的问题,所以我决定简化一些事情以检测问题的根源。我找到了导致所有问题的功能。我把它放在main中,并用随机参数顺序执行了很多次。它在 146000-156000 时间之间崩溃。 (为了确保我已经使用崩溃但正常执行的参数重新执行了该函数)。
我注意到将参数对象作为全局变量可以提高时间(2个对象为参数时为78000,全局时为150000左右),其他参数为简单整数
我使用许多向量作为函数的局部变量,但我认为这不是原因,因为它们在函数完成处理时被破坏。
这次崩溃的原因是什么?
for (int i=0;i<600000; i++){
int _trx=-1020+((rand())%2039);
int _try=-1020+((rand())%2039);
double _or=(rand()%36000)/100;
int _scale=rand()%2 -1 ;
std::cout << i <<": trans x: " << _trx << " | trans y: " << _try << " | or: " << _or << std::endl;
double _score= Test(1,_trx,_try, _or,1,0,5,5,1024);
cout <<" |score: " << _score << endl;
}
【问题讨论】:
-
很难说没有代码发布
-
多线程问题的典型情况是偶发错误(由于多线程中的非确定性)。在 C++ 中,您从编译器或标准库中获得的帮助较少。您只能“擦亮眼睛”或切换到具有更好 MT 支持的语言(例如 Rust)。说真的:请编辑您的问题并发送MCVE。
-
如果在大约相同数量的迭代后每次都发生崩溃,这可能是一些未检查的“超出”问题(例如内存不足)的提示。要检查这一点,查看堆栈跟踪(核心转储)可能会有所帮助。
-
使用valgrind 发现内存泄漏。
-
编译所有警告和调试信息:
g++ -Wall -Wextra -gwith GCC。阅读undefined behavior,因为您可能有一些。 使用调试器gdb,下次您提出关于 SO 的问题时,请提供一些 minimal reproducible example
标签: c++ function parameters call