另一个 SO 线程解释了如何用thread::native_handle
它来做 C++ 线程 API 之外的事情(例如,设置线程的优先级)。要点是:
std::thread t(functionToRun);
auto nh = t.native_handle());
// configure t using nh
这种方法的问题在于,functionToRun
在配置 t 的代码完成之前,它可能会执行任意时间(包括完成)。
我相信我们可以防止这种情况发生如下(未经测试):
std::atomic<bool> configured(false);
std::thread t([&]{ while (!configured); // spin until configured is true
functionToRun(); });
auto nh = t.native_handle();
// configure t using nh
configured = true;
不幸的是,这会导致生成的线程旋转等待configured
变为真。生成的线程最好在配置完成之前阻塞。
实现这一目标的一种方法似乎是使用互斥锁(也未经测试):
std::mutex m;
std::unique_lock<std::mutex> lock(m);
std::thread t([&]{ std::lock_guard<std::mutex> lg(m); // block until m available
functionToRun(); });
auto nh = t.native_handle();
// configure t using nh
lock.unlock(); // allow t to continue
这似乎应该可以工作,但是从概念上讲,condvar 似乎更适合指示何时满足条件(配置完成)的工作。但是使用 condvar 需要上述所有条件,再加上一个 condvar,并且需要处理虚假唤醒的可能性,据我所知,这对于互斥锁来说不是问题。
有没有更好的方法来产生一个线程,然后让它立即停止,以便我可以使用它的本机句柄来配置它,然后再允许它进一步运行?