我可以创建具有相同名称的 C++ 线程吗?

Posted

技术标签:

【中文标题】我可以创建具有相同名称的 C++ 线程吗?【英文标题】:Can I create the C++ threads with the same name? 【发布时间】: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 个不同的线程。 【参考方案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 寿命更长。否则是的。

以上是关于我可以创建具有相同名称的 C++ 线程吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++结构可以有成员函数吗?

C# 到 C++ 多线程,有啥问题吗?

创建多个具有相同名称的类对象? C++

笔试题

多个线程可以安全地同时将相同的值写入同一个变量吗?

我可以分析我的代码以查看创建大量线程的原因吗?