【发布时间】:2018-08-10 22:35:15
【问题描述】:
我正在尝试在 C++ 11 的 std::thread 之上构建一个线程安全层,其中每个对象都分配给一个拥有的线程,并且某些调用在错误的线程上使用时会引发硬错误。拥有线程是唯一可以将对象传输到另一个线程的线程。
一切正常,除了,我找不到在线程实际运行之前获取线程thread::id 的方法。而且我需要在交付对象之前将新线程的 ID 附加到对象上。
如果我使用
std::thread newThread( [theObject]()
{
// use theObject here.
} );
我能得到线程ID的最早点是在线程对象定义之后,此时线程已经在运行了。
我看到std::thread 有一个默认构造函数,但是我看不到一种方法可以给它一个函数,以便之后在线程上运行。
有没有办法在线程上执行两步构造,或者在创建时控制线程的ID?
【问题讨论】:
-
编写线程函数使其立即阻塞,当构造函数完成并且知道 id 时由主线程释放,这是很常见的。
-
你可以存储线程的地址而不是
id吗?然后,如果您仍然需要id。您始终可以从 地址 (thread->get_id()) 获得它。 -
@Galik 这是同样的问题,只是形状不同。在构造函数返回之前我无法获取地址,此时线程已经在运行并且可能已经遇到需要知道线程 ID 的代码。
标签: c++ multithreading stdthread