当前位置: 首页 > 知识库问答 >
问题:

c多线程参数问题

谭思博
2023-03-14

我正在尝试将一系列参数传递给不同的c线程。当NumThreads == 1时,程序运行良好,但是当NumThreads

创建线程的位置:

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怎么对所有三个线程都是相同的呢?!?

共有1个答案

白浩荡
2023-03-14

通过将指向局部变量的指针传递给线程并允许该变量在使用之前超出范围,您正在调用未定义的行为。

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 循环作用域本地数组,当传递给线程构造函数时,它会隐式衰减为指向其第一个元素的指针。一旦循环的每次迭代完成,p就会超出范围并被销毁,但线程仍然有一个指向它曾经驻留的内存的指针。

修复此问题的最佳选项是将double p[3]替换为std::array

 类似资料:
  • 各位大佬请教一个问题,当我实现任务队列时rpushTasksQueue始终要比我上限少一个,比如我设定的上限是3,然后他2执行完就结束了,求救

  • 我把这段代码编译为名为a.out的程序,然后又写了一个shell脚本,shell脚本的功能是无限运行程序,然后等2秒后,我停止运行shell脚本,然后我发现在某次运行a.out时,"This is a thread test\n"被运行了两次,我就有一点疑惑,按理来说,如果testThread有机会运行的话,最多只打印一次"This is a thread test\n",结果就只打印了两次,我就

  • 主要内容:线程生命周期,主线程,Thread 类中的属性和方法,创建线程,管理线程,销毁线程多线程就是多个线程同时工作的过程,我们可以将线程看作是程序的执行路径,每个线程都定义了一个独特的控制流,用来完成特定的任务。如果您的应用程序涉及到复杂且耗时的操作,那么使用多线程来执行是非常有益的。使用多线程可以节省 CPU 资源,同时提高应用程序的执行效率,例如现代操作系统对并发编程的实现就用到了多线程。到目前为止我们编写的示例程序都是单线程的应用程序,这样的应用程序一次只能执行一个任务。 线程

  • 多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。 基于线程的多任务处理是同一程序的片段的并发执行。 多线程程序包含可以同时运行的两个或多个部分。这样的程序中的每个部分称为一个线程,每个线程定义了一个单独的执行路径。 本教程假设您使用的是 Linux 操作系统,我们要使用

  • 本文向大家介绍C#程序将参数传递给线程,包括了C#程序将参数传递给线程的使用技巧和注意事项,需要的朋友参考一下 要使用线程,请在代码中添加以下命名空间- 首先,您需要在C#中创建一个新线程- 上面,threadDemo是我们的线程函数。 现在将参数传递给线程- 上面设置的参数是- 示例 让我们看完整的代码,以将参数传递给C#中的线程。 输出结果

  • 本文向大家介绍C#多线程传递参数及任务用法示例,包括了C#多线程传递参数及任务用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#多线程传递参数及任务用法。分享给大家供大家参考,具体如下: 更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技