如何使用C++中的boost创建线程池,如何将任务分配给线程池?
我有一个令人尴尬的并行问题,我想在多个处理器上执行.我本以为boost::thread会自动将新线程发送到新处理器,但所有这些线程都在与父进程相同的核心上执行.是否可以让每个线程在不同的处理器上运行,还是需要像MPI这样的东西?
我怀疑这boost::thread不是一个多处理器工具,我要求它做一些不是为它设计的东西.
编辑:我的问题归结为:为什么所有线程都在一个处理器上执行?有没有办法让boost::thread线程发送到不同的处理器?
这是我的代码的相关示例:
size_t lim=1000;
std::deque<int> vals(lim);
std::deque<boost::thread *> threads;
int i=0;
std::deque<int>::iterator it = vals.begin();
for (; it!=sigma.end(); it++, i++) {
threads.push_back(new boost::thread(doWork, it, i));
while (threads.size() >= maxConcurrentThreads) {
threads.front()->join();
delete threads.front();
threads.pop_front();
}
}
while(threads.size()) {
threads.front()->join();
threads.pop_front();
}
Run Code Online (Sandbox Code Playgroud)
应该清楚,doWork使用参数进行一些计算i并将结果存储在中vals.我的想法是设置maxConncurrentThreads为等于可用核心数,然后每个线程将使用空闲的核心.我只需要有人确认boost::thread不能以这种方式工作.
(我猜想有一种更好的方法来限制并发线程的数量而不是使用队列;也可以随意骂我.)
这是doWork功能:
void doWork(std::deque<int>::iterator it, int i) {
int ret=0;
int size = 1000; // originally 1000, later …Run Code Online (Sandbox Code Playgroud) 我试图实现一个ThreadPool,但不幸的是我遇到了一些问题.
这就是我已经拥有的.
//includes ...
void call()
{
std::cout << "Hi i'm thread no " << std::this_thread::get_id() << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "ready " << std::this_thread::get_id() << std::endl;
};
//Implementation is not shown here to reduce code
class WorkQueue {
public:
bool push(std::function<void()> const& value);
void pop();
bool empty();
};
std::condition_variable g_queuecheck;
std::mutex g_lockqueue;
std::atomic<bool> g_notified;
class ThreadPool
{
public:
ThreadPool(int iNoThread) :
m_noThread(iNoThread)
{
g_notified.store(false);
m_threads.resize(iNoThread);
bIsReady.store(false);
for (int i = 0; i < iNoThread; ++i)
m_threads[i] = std::thread(&ThreadPool::run, this); …Run Code Online (Sandbox Code Playgroud) 这是我在Java中用于在Java中进行异步函数调用的一些代码:
public class AsyncLogger
{
public static asyncLog = null;
public static ExecutorService executorService = Executors.newSingleThreadExecutor();
public static AsyncLogger GetAsyncClass()
{
if(asyncLog == null)
{
asyncLog= new AsyncLogger();
}
return asyncLog;
}
public void WriteLog(String logMesg)
{
executorService.execute(new Runnable()
{
public void run()
{
WriteLogDB(logMesg);
}
});
}
public void ShutDownAsync()
{
executorService.shutdown();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个带有静态ExecutorService的Singleton类,WriteLogDB将被称为异步函数.所以我可以异步处理WriteLogDB中的代码而不影响主流.
我可以得到这样的C++等价物吗?