我可以创建具有相同名称的 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++ 线程吗?的主要内容,如果未能解决你的问题,请参考以下文章