c++多线程参数问题
c++ Multi-threading Argument Issues
我正试图将一系列参数传递到不同的c++线程中。当NumThreads==1时,程序运行良好,但当NumThreads>1时,我传递给函数的p参数在线程中不正确。我是不是在线程构造函数中遗漏了什么,并且没有按值传递p?
创建线程的位置:
int NumThreads = 2;
std::thread t[numSamplePoints];
std::mutex dataLock;
for( int i = 0 ; i < numSamplePoints ; i++)
{
// Prevent more than NumThreads from running at once
if( i > NumThreads && t[i-NumThreads].joinable() )
{
t[i - this->NumThreads].join();
}
// Set and Check Input Parameters
double p[3];
srcPoints->GetPoint(i , p);
if( i < 3 )
{
cout<< "OUTTHREAD " << p[0] << " " << p[1] << " " << p[2] <<endl;
cout<< "src: " << Id << " index: " << i <<endl;
}
t[i] = std::thread(&MyClass::MyFunction, this, &dataLock, i, Id, p);
}
被调用的成员函数:
void MyClass::MyFunction(std::mutex *dataLock, int sampleIndex, int Id, double srcPoint[3])
{
dataLock->lock();
if( sampleIndex < 3)
{
cout<< "IN THREAD " << srcPoint[0] << " " << srcPoint[1] << " " << srcPoint[2] <<endl;
cout<< "src: " << sourceId << " index: " << sampleIndex <<endl;
}
dataLock->unlock();
}
前三个线程的控制台输出:{
OUTTHREAD 45.7694 1.06209 -60.9628
src: 0 index: 0
OUTTHREAD 48.6044 -5.40514 -54.7663
src: 108 index: 1
OUTTHREAD 52.505 9.00298 -47.0499
src: 216 index: 2
IN THREAD 52.505 9.00298 -47.0499
src: 0 index: 0
IN THREAD 52.505 9.00298 -47.0499
src: 108 index: 1
IN THREAD 52.505 9.00298 -47.0499
src: 216 index: 2
因此,ID和示例索引被正确地传递给线程,但srcPoint如何对所有三个线程都相同?!?
通过将指向本地变量的指针传递给线程并允许变量在使用之前超出范围,可以调用未定义的行为。
C样式数组从不按值传递。一个声明以数组类型为参数的函数实际上使用了一个指针:
void MyClass::MyFunction(std::mutex *dataLock, int sampleIndex, int Id, double srcPoint[3])
相当于
void MyClass::MyFunction(std::mutex *dataLock, int sampleIndex, int Id, double* srcPoint)
在这种情况下,p
数组是for
循环作用域的本地数组,当传递给thread
构造函数时,它隐式地衰减为指向其第一个元素的指针。一旦循环的每次迭代完成,p
就会超出范围并被销毁,但线程仍然有一个指向它曾经驻留的内存的指针。
修复此问题的最佳选项是在循环中用std::array<double, 3> p
替换double p[3]
,并使MyClass::MyFunction
采用参数std::array<double, 3> srcPoint
而不是double srcPoint[3]
。与原始C样式数组不同,std::array
可以通过值传递,并实现您期望的复制语义。
相关文章:
- C++转换参数初始化问题
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 标准::enable_if 和标准::is_arithmetic 作为模板参数的问题
- enable_if中参数包的大小问题
- 构造函数 (C++) 中的 char 指针参数存在问题
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++复杂情况的比较器通过参数问题
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 模板<类型名称...参数>的问题
- C++17 中的歧义错误(模板模板参数和默认参数问题)
- constexpr 运算符重载使用参数的问题
- 通过命令行参数获取llvm ir文件时面临问题
- 函数中使用的函数指针的参数的问题
- 我在生成返回为数不多的模板化参数之一cpp的函数时遇到问题
- 从命令行获取参数时出现问题
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- C++:关于for语句和参数的一般问题
- 字符串打印机问题:参数 X 没有从“char (*)[xx]”到“char**”的已知转换