gpt4 book ai didi

c++ 多线程参数问题

转载 作者:行者123 更新时间:2023-11-28 05:34:07 25 4
gpt4 key购买 nike

我正在尝试将一系列参数传递到不同的 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超出范围并被销毁,但您的线程仍然有一个指向它曾经驻留的内存的指针。

解决此问题的最佳选择是替换 double p[3]std::array<double, 3> p在你的循环中制作MyClass::MyFunction取一个参数 std::array<double, 3> srcPoint而不是 double srcPoint[3] .与原始 C 风格数组不同,std::array可以按值传递,并实现您期望的复制语义。

关于c++ 多线程参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38728780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com