使用 boost :: thread 开了一个线程,如何判断该线程是不是进行完毕? 且如何释放该进程所用的资源?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 boost :: thread 开了一个线程,如何判断该线程是不是进行完毕? 且如何释放该进程所用的资源?相关的知识,希望对你有一定的参考价值。
尽量不用.join(),这样很耽误时间
你可以使用Future来做这件事情:ExecutorService executorService = Executors
.newFixedThreadPool(10);
List<Future<Void>> futureList=new ArrayList<Future<Void>>();
for (int i = 0; i < partNumber - 1; i++)
Callable callableImpl = new Callable<Void>()
public void call()
//Do something
;
Future<Long> completeFuture = executorService.submit(callableImpl);
futureList.add(completeFuture);
for (Future<Void> currentTask: futureList)
if (currentTask.isDone())
//Do something
参考技术A System.gc();
boost - thread.join() 停止用户界面
【中文标题】boost - thread.join() 停止用户界面【英文标题】:boost - thread.join() halts the ui 【发布时间】:2014-02-25 19:28:17 【问题描述】:我读到 join 会阻塞调用它的线程,直到线程函数返回。因此,如果我的主线程创建了一个 boost 线程,然后调用 join,那么我的主线程将被阻塞。 在我的情况下,用户界面是主线程,它需要等待线程完成才能执行下一条语句,当我使用 thread.join() 时,用户界面会冻结。我目前有这样的东西
boost::thread t(&Myclass::mymethod,ptr,parameter);
t.join(); //This blocks the ui
SomeOtherMethd();
现在我的问题是如何等待线程 t 结束然后调用 SomeOtherMethod 而不阻塞 UI。由于 t.join() 似乎冻结了 ui
【问题讨论】:
通常的方法是让主循环继续,并检查(非阻塞)例如指示线程函数已完成工作的信号量或条件变量。 【参考方案1】:由于您使用的是 Qt,所以这样做的非阻塞方式是:
从您的工作线程发送信号 使 SomeOtherMethd() 成为一个插槽作为参考,请查看来自 Qt 项目的 Mandelbrot Example,它使用队列连接在工作线程和主线程之间进行通信。
【讨论】:
【参考方案2】:给线程一个函数,以正确的顺序在顺序模式下执行您需要的操作。这是一个简化的例子:
void foo()
ptr->mymethod(parameter);
SomeOtherMethod();
boost::thread t(foo);
// do other stuff while thread runs
t.join()
【讨论】:
@MistyD 是的,但是当您完成所有操作时可能会发生这种情况。关键是SomethOtherMethod
在调用ptr->mymethod()
之后发生,没有阻塞。你可以在启动线程和调用join()
之间做各种事情。以上是关于使用 boost :: thread 开了一个线程,如何判断该线程是不是进行完毕? 且如何释放该进程所用的资源?的主要内容,如果未能解决你的问题,请参考以下文章
MFC 多线程:AfxBeginThread 与 Boost.Thread?