【问题标题】:Can I create the C++ threads with the same name?我可以创建具有相同名称的 C++ 线程吗?
【发布时间】:2021-06-07 01:57:41
【问题描述】:

每个人。 我写的代码如下:

std::thread t1(cmdThread);
t1.detach();

for (int n = 0; n < tCount; n++)
{
    std::thread t1(sendThread,n+1);
    t1.detach();
}

CmdThread 和 sendThread 是不同的。 所有名为 t1 的线程,但它们正常工作。这让我很困惑。 在 for 循环中,我想创建 4 个线程。 C++是否允许用户创建同名线程并且线程也可以很好的分离?

【问题讨论】:

  • 也许你应该看看nested scopes
  • 我不知道你说的线程名是什么意思,t1是一个变量符号,与最终执行的代码完全无关。如果您想查看唯一标识特定线程的内容,您应该查看std::thread::get_id()
  • 是的,伙计。我在函数sendThread中使用了函数std::this_thread::get_id()。 get_id 表明 for 循环中有 4 个不同的线程。

标签: c++ c++11 thread-safety threadpool


【解决方案1】:

我可以创建同名的 C++ 线程吗?

在 C++ 中,没有线程有名字的概念。

所有名为 t1 的线程

t1 是一个变量。变量的类型是std::thread,它是一个线程包装器。 t1 是循环体的局部变量,因此变量在每次迭代中命名一个新对象。

在初始化时,由变量t1 命名的线程包装器创建了一个线程,该线程随后归包装器所有。包装器创建的线程没有名称。当线程与t1 分离时,包装器不再拥有线程并且分离的线程没有所有者。在迭代结束时,线程包装器被销毁。在下一次迭代中,重复这个过程。

你可以做你在示例程序中所做的事情。

【讨论】:

  • 谢谢先生。 “std::thread t1(cmdThread); t1.detach();”当t1第一次被分离。删除 t1 并创建 cmdThread 线程。接下来运行“std::thread t1(sendThread,n+1); t1.detach();”行的程序,创建一个新的 t1。然后 t1 被分离并删除。最后,n++ 进入下一个 for 循环并重复创建 t1 并分离它。是吗?
  • @AdamPengC 没有“cmdThread 线程”。创建一个线程,并在该线程中调用函数cmdThread。并且自动对象不会被“删除”。它们在超出范围时被销毁。此外,外部作用域中的t1 比循环主体中的t1 寿命更长。否则是的。
猜你喜欢
  • 2014-06-05
  • 2018-10-21
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2016-04-04
相关资源
最近更新 更多