在 C++ 中,如果您想等待一个线程执行完毕,并设置超时时间,您可以使用
std::thread
的
joinable()
方法和
std::chrono
库中的时间函数。
具体来说,您可以在启动线程后调用
joinable()
来检查线程是否可加入,如果是,则调用
join()
等待线程完成,如果在超时时间内线程未完成,则可以使用
detach()
分离线程并让其继续运行,或者抛出异常或采取其他适当的措施。
下面是一个示例代码:
#include <iostream>
#include <thread>
#include <chrono>
void foo() {
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "Thread finished" << std::endl;
int main() {
std::thread t(foo);
if (t.joinable()) {
if (t.joinable()) {
// 等待线程完成
if (t.joinable()) {
t.join();
std::cout << "Thread joined" << std::endl;
} else {
// 超时
t.detach();
std::cout << "Thread detached" << std::endl;
return 0;
在这个示例中,foo()
函数是一个简单的线程函数,它将线程暂停2秒钟,然后输出一条消息。
在 main()
函数中,我们启动了一个线程 t
,并检查它是否可加入。如果是,我们调用 join()
等待线程完成,否则我们调用 detach()
分离线程并让其继续运行。在本例中,我们没有设置超时时间,因此线程要么会完成要么会一直运行下去。
如果您需要设置超时时间,请使用 std::chrono::steady_clock::now()
来获取当前时间,然后计算超时时间并等待线程完成或超时。具体来说,您可以使用以下代码:
#include <iostream>
#include <thread>
#include <chrono>
void foo() {
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "Thread finished" << std::endl;
int main() {
std::thread t(foo);
if (t.joinable()) {
// 设置超时时间为1秒钟
auto timeout = std::chrono::steady_clock::now() + std::chrono::seconds(1);
// 等待线程完成或超时
while (t.joinable() && std::chrono::steady_clock::now() < timeout) {
t.join_for(std::chrono::milliseconds(100));
if (t.joinable()) {
// 超时
t.detach();
std::cout << "Thread detached" << std::endl;
} else {
// 线程完成
std::cout << "Thread joined" << std::endl;
return 0;
在这个示例中,我们设置超时时间为1秒钟,并在一个循环中等待线程完成或超时。我们每100毫秒检查