假设我在Linux上的C ++应用程序中使用for
循环创建了10个pthread。所有这10个线程都调用相同的线程函数。我希望最后一个退出线程(在[1..10]之间)调用一个我可以清除一些数据的函数。有没有这样的pthread函数? (不是讨论特定于线程的数据和pthread_once()
)
注意:此处的要求不在std::thread
。
答案 0 :(得分:1)
如果你想要退出的最后一个线程来执行工作,那么让所有10个线程减少一个开始设置为线程数的计数器。如果您正在使用std::atomic
,那么当您执行fetch_sub
并获取值1
时,您将知道您是最后一个正在运行且可以执行工作的线程:
int threads_active = atomic_threads_active.fetch_sub(1);
if (threads_active == 1)
{
// We are the last thread of the 10 that were launched.
clearSomeData();
}
答案 1 :(得分:0)
我不知道具体的功能,但你可以简单地加入循环中的所有10个线程。一旦所有线程都已加入,您就可以执行该功能。您可以在生成10个线程的线程中执行此操作,或者如果您愿意,可以在单独的线程中执行此操作。
我不得不分离所有线程
如果你想等他们退出,这不是一个很好的选择。
但是你可以通过使用10个条件变量的共享数组来解决它。每个线程都应设置与其对应的变量并调用pthread_cond_signal
。服务员应该在循环中使用pthread_cond_wait
来等待设置每个条件变量。
在这种情况下,main()调用func1(),func1()创建一个指向pthread_ts数组的pthread_t指针(pthread_t * tid = new pthread_t [10])。并在for循环中创建10个线程。创建之后,控件将返回main(),main()还有其他任务要做。现在,问题是如何从堆内存中删除(tid)?
你可以按照我的建议去做。不要分离线程,但要等待线程加入循环。一旦它们完成,您就可以自由地销毁线程对象。你可以像我说的那样在一个单独的线程中完成这个。主线程无需等待任何事情。