【问题标题】: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 按照您的建议更改代码,但输出仍然像以前一样混杂
  • 您的线程是否都锁定了相同的互斥锁?如果它们各自锁定不同的互斥体,那么它们将不会相互同步。

标签: c++ multithreading


【解决方案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 已经用在了第一行输出 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
相关资源
最近更新 更多