gpt4 book ai didi

c++ - 如何使生成的线程停止足够长的时间以使生成线程执行某些操作?

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:06 25 4
gpt4 key购买 nike

Another SO thread解释了如何使用 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,并且需要处理虚假唤醒的可能性,据我所知,这不是互斥锁的问题。

有没有更好的方法来生成一个线程,然后让它立即停止,这样我就可以在允许它进一步运行之前使用它的本地句柄来配置它?

最佳答案

当我希望延迟线程的主要功能的启动,直到完成某些外部配置时,我会使用 future。这避免了自旋等待,并且具有与互斥锁或条件变量相同的阻塞属性,但提供了更清晰的意图。使用此模式,您可以将示例编写为:

std::promise<void> p;
std::thread t([&p]{
p.get_future().wait();
thread_func();
}

auto nh=t.native_handle();
// configure nh
p.set_value();

我特别喜欢将此模式与 shared_future 一起用于多线程测试 --- 这样您可以确保所有线程都在运行并在测试开始前准备就绪。

关于c++ - 如何使生成的线程停止足够长的时间以使生成线程执行某些操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11183146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com