执行并行任务,无需等待C++结果
Execute parallel tasks without waiting for results in C++
是否有可能执行并行任务(例如 async
) 没有等到所有线程都完成?我想并行化定时函数调用,例如线程必须等待一段时间才能完成工作,并在必要时重复它(可能需要几秒钟或几分钟)。还是有其他方法可以实现它?
这是我的示例代码:
#include <iostream>
#include <future>
#include <algorithm>
#include <vector>
class Item
{
public:
int id;
int delayTime; // in ms
int cycles; // number of repetitions
};
class JobManager
{
private:
std::vector<Item> fItems;
public:
JobManager()
{
Item item1, item2;
item1.id = 12;
item1.cycles = 3;
item1.delayTime = 2000;
fItems.push_back(item1);
item2.id = 34;
item2.cycles = 2;
item2.delayTime = 25000;
fItems.push_back(item2);
}
~JobManager() {}
void DoJob(Item& item) {std::cout << "Item " << item.id << "(thread " << std::this_thread::get_id() << ")" << " is doing the job." << std::endl; }
void Start(Item& item)
{
std::this_thread::sleep_for(std::chrono::milliseconds(item.delayTime)); // wait some time
for (int i = 0; i < item.cycles; i++) // repeat the job
{
DoJob(item);
}
}
void Run()
{
std::vector<std::future<void>> futures;
for (auto &it : fItems)
{
futures.push_back(std::async(&JobManager::Start, this, std::ref(it)));
}
// DON'T WANT TO WAIT
//std::for_each(futures.begin(), futures.end(), [](std::future<void> & fut)
//{
// fut.wait();
//});
}
};
int main()
{
JobManager m;
// real method receives a message from network
// so it can be simulated as loop, something like
while(true)
{
m.Run();
Sleep(3000);
}
}
一个基于std::thread的实现应该可以解决问题。
例
#include <chrono>
#include <thread>
#include <vector>
#include <memory>
#include <cstdio>
#include <cstdlib>
#include <functional>
using std::ref;
using std::hash;
using std::bind;
using std::vector;
using std::thread;
using std::shared_ptr;
using std::make_shared;
using std::chrono::seconds;
using std::chrono::milliseconds;
struct Job
{
int id;
int cycles;
milliseconds delayTime;
};
class JobManager
{
public:
JobManager( void ) : m_jobs( ), m_workers( )
{
m_jobs.push_back( { 12, 3, milliseconds( 2000 ) } );
m_jobs.push_back( { 34, 2, milliseconds( 5000 ) } );
}
virtual ~JobManager( void )
{
for ( auto worker : m_workers )
{
worker->join( );
}
}
void DoJob( Job& job )
{
auto thread_id = hash< thread::id >( )( std::this_thread::get_id( ) );
printf( "Job %i (thread %lu) is doing the job.n", job.id, thread_id );
}
void Start( Job& job )
{
std::this_thread::sleep_for( job.delayTime );
for ( int cycle_count = 0; cycle_count < job.cycles; cycle_count++ )
{
DoJob( job );
}
}
void Run( void )
{
for ( auto &job : m_jobs )
{
auto worker = std::make_shared< thread >( bind( &JobManager::Start, this, ref( job ) ) );
m_workers.push_back( worker );
}
}
private:
vector< Job > m_jobs;
vector< shared_ptr< thread > > m_workers;
};
int main( int, char** )
{
JobManager manager;
manager.Run( );
std::this_thread::sleep_for( seconds( 10 ) );
return EXIT_SUCCESS;
}
建
g++ -o 示例示例.cpp -std=c++11 -pthread
引用
标准::线程 API 参考
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- 等待整个 omp 块完成,然后再调用第二个函数
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 等待被迷住了,没有回来
- 等待 WaitForMultipleObjects 窗口中的事件数量可变
- 一个线程等待多个线程事件
- 等待 qthread 终止的正确方法是什么?
- 不可预测的C++睡眠/等待行为
- Bison/flex 在识别规则后等待输入
- 使用记事本C++打开 txt 文件时无需等待
- 接受函数在发送数据包时等待
- 在Visual Studio中运行/调试C ++时,如何在结束时等待输入
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 在等待时破坏condition_variable
- 如何处理 RAII 中的资源等待