最近,我一直在尝试寻找一个用于线程并发任务的库。理想情况下,一个简单的接口,调用线程上的函数。任何时候都有n个线程,有些线程完成得比其他线程快,并且在不同的时间到达。
首先我在试Rx,这在c语言中很好。我也研究了区块和TBB,但它们都依赖于平台。对于我的原型,我需要保持平台独立性,因为我们还不知道它将在什么平台上运行,并且在做出决定时可以更改。
C 11有很多关于线程和并发的东西,我发现了很多关于线程池的例子。
https://github.com/bilash/threadpool
类似的项目使用相同的lambda表达式与std::线程和std::互斥锁。
这看起来非常适合我的需要。这里有一些问题。池由定义数量的线程启动,任务排队,直到一个线程空闲。
如何添加新线程?删除过期的线程?(.Join()??)
显然,对于已知数量的线程来说,这要容易得多,因为它们可以在ctor中初始化,然后在dtor中加入join()。
有C并发经验的人有什么建议吗?
这应该很容易使用:https://pocoproject.org/docs/Poco.ThreadPool.html
线程池总是让多个线程运行,随时准备接受工作。创建和启动线程会给应用程序带来巨大的运行时开销。线程池通过减少必须创建(并再次销毁)的线程数量,有助于提高应用程序的性能。线程池中的线程一旦再次可用,就会被重用。线程池始终保持最少数量的线程运行。如果对线程的需求增加,就会创建额外的线程。一旦对线程的需求再次下降,不再使用的线程将停止并从池中移除。
ThreadPool(
int minCapacity = 2,
int maxCapacity = 16,
int idleTime = 60,
int stackSize = 0
);
这是一个非常好的库,易于使用,不像Boost:(
https://github.com/pocoproject/poco
>
从系统可以支持的最大线程数开始:
int Num_Threads = thread::hardware_concurrency();
为了实现高效的线程池,一旦根据Num_线程创建了线程,最好不要创建新的线程,也不要破坏旧的线程(通过加入)。这将导致性能下降,甚至可能使应用程序运行速度比串行版本慢。
每个C 11线程都应该在其函数中以无限循环运行,不断等待新任务抓取并运行。
下面是如何将此类函数附加到线程池:
int Num_Threads = thread::hardware_concurrency();
vector<thread> Pool;
for(int ii = 0; ii < Num_Threads; ii++)
{ Pool.push_back(thread(Infinite_loop_function));}
Infinite_loop_function
这是一个等待任务队列的“当(真)”循环
void The_Pool:: Infinite_loop_function()
{
while(true)
{
{
unique_lock<mutex> lock(Queue_Mutex);
condition.wait(lock, []{return !Queue.empty()});
Job = Queue.front();
Queue.pop();
}
Job(); // function<void()> type
}
};
创建一个函数,将作业添加到队列中
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
将任意函数绑定到您的队列
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
一旦你整合了这些元素,你就拥有了自己的动态线程池。这些线程总是在运行,等待作业完成。
我对最新gcc中基于pthread和Ubuntu开发环境的线程的互斥锁和消息传递的性能感兴趣。一个很好的通用问题是用餐哲学家,每个哲学家使用lh和rh叉子与左右手邻居共享。我把哲学家的数量增加到99个,让我的四核处理器保持忙碌。 上面的代码允许我的哲学家尝试抓住他们需要的两个叉子。 上面的代码监控我的哲学家的进食或思考进度,这取决于他们是否能够保留这两个叉子。 在所有哲学家尝试自由选择后,等待所有
问题内容: 我有一个运行时间很长的过程,可以监听事件并进行一些激烈的处理。 目前,我通常用于限制并发运行的作业数量,但是根据一天中的时间以及其他各种因素,我希望能够动态地增加或减少并发线程的数量。 如果我减少了并发线程的数量,那么我希望当前正在运行的作业能够很好地完成。 是否有Java库可以让我控制并动态增加或减少线程池中运行的并发线程数?(该类必须实现ExecutorService)。 我必须自
我在Ubuntu13.04桌面上运行这个非常简单的程序,但是如果我注释掉sleep_for一行,它会在从main打印cout后挂起。有人能解释为什么吗?据我所知,main是一个线程,t是另一个线程,在本例中,互斥体管理共享cout对象的同步。
我正在写一个小的多线程超文本传输协议文件下载程序,并希望能够缩小可用的线程,因为代码遇到错误 这些错误将特定于在web服务器不允许任何更多连接的情况下返回的http错误 eg.如果我设置了一个由5个线程组成的池,每个线程都试图打开自己的连接并下载文件块。服务器可能只允许2个连接,我相信会返回503个错误,我想检测到这一点并关闭一个线程,最终限制池的大小,大概只有服务器允许的2个 我能让线自动停止吗
利用coreplot画数据统计折线。 [Code4App.com]
令我惊讶的是,已经完成执行但尚未加入的C11std::thread对象仍然被视为活动执行线程。下面的代码示例说明了这一点(基于Xubuntu 13.03和G4.7.3构建)。有人知道C 11标准是否提供了一种检测std::thread对象是否仍在积极运行代码的方法吗?