多个线程使用不同的参数值集调用相同的函数

Posted

技术标签:

【中文标题】多个线程使用不同的参数值集调用相同的函数【英文标题】:Multiple threads call the same function with different set of argument values 【发布时间】:2021-05-27 02:47:58 【问题描述】:

我正在学习 C++ 中的多线程,我在其中编写了一个简单的程序,其中多个线程调用相同的函数。在每个函数调用中,我传递不同的参数值。

下面是输出sn-p的程序。

void add(int x,int y) 
  int sum = x + y;
  cout<<sum<<endl;


int main()

  int a,b;
  vector<thread> th;

  for(int i=0;i<100;i++) 
     a=i;
     b=i+1;
     th.push_back(thread(add,a,b));
  
       
  for(int i=0;i<100;i++)
    th[i].join();

最大总和应为 201,但在输出中但一项显示为 713。这可能是因为线程独立运行,因此结果是随机的。 输出:

31

19
11
713
9
5

21
...

我想知道如何按顺序获取它的输出。

由于每个线程都创建自己的调用堆栈,并且不同线程调用的同一函数的局部函数变量是唯一的,因此,我认为在这种情况下不需要互斥锁,因为每个线程都在自己的地址空间中执行代码,他们不共享任何变量。如果我错了,请纠正我?

另外,请推荐一些资源(电子书、课程等)来学习 C++ 中的多线程基础知识。

【问题讨论】:

所有线程都在访问同一个cout 对象,因此它们的输出可以混合在一起。例如,713 可能是一个线程输出7 和另一个线程同时输出13。如果你想确保你的线程不会踩到彼此的输出,你应该有一个互斥锁,并在使用cout之前让每个线程锁定它,然后再解锁它。 您是希望按照线程创建的顺序打印结果,还是只是确保每个线程的输出不同? @Alan 两个,我正在努力掌握多线程的概念 @JeremyFriesner 按照您的建议更改代码,但输出仍然像以前一样混杂 您的线程是否都锁定了相同的互斥锁?如果它们各自锁定不同的互斥体,那么它们将不会相互同步。 【参考方案1】:

713 是 7 和 13。 试试

void add(int x,int y) 
  int sum = x + y;
  cout<< std::to_string(sum) + "\n";

您应该使用互斥锁以独占方式访问 std::cout。

【讨论】:

我们怎么知道不是 71 和 3? 或者它可以是713,或者其他任何东西。一旦你调用了未定义的行为,几乎一切皆有可能:) @JeremyFriesner 我认为 1 和 3 已经用在了第一行输出 :-)

以上是关于多个线程使用不同的参数值集调用相同的函数的主要内容,如果未能解决你的问题,请参考以下文章

Jmeter在一次线程里多次调用同一个拼接参数,不使用自带拼接函数

尝试在其线程函数参数中将不同的值传递给 openMp 线程

C#线程调用方法时,怎么传参数过去

(1) 如何向线程对应的函数传递参数?一个参数如何传递,多个参数如何传递? (2) 深入理解线程与进程的

在C#中使用线程,线程的方法函数中需要带一个数组的参数传递进去

Java编程思想(20170816)