相关疑难解决方法(0)

如何在C++中使用boost创建线程池?

如何使用C++中的boost创建线程池,如何将任务分配给线程池?

c++ boost boost-thread boost-asio threadpool

51
推荐指数
3
解决办法
6万
查看次数

多处理器Boost :: Thread?所有线程都在一个处理器上运行

我有一个令人尴尬的并行问题,我想在多个处理器上执行.我本以为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)

c++ parallel-processing multithreading boost boost-thread

4
推荐指数
1
解决办法
3225
查看次数

C++ ThreadPool没有并行运行

我试图实现一个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)

c++ concurrency threadpool

2
推荐指数
1
解决办法
1080
查看次数

C++中的异步函数调用

这是我在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++等价物吗?

c++ asynchronous

0
推荐指数
2
解决办法
3488
查看次数