int
main()
{
std::mutex io;
std::vector<std::future<void>> futures;
std::cout << "Main id: " << std::this_thread::get_id() << std::endl;
for (int i = 0; i < 12; ++i) {
std::future<void> f = std::async(std::launch::async, [&]{
std::this_thread::sleep_for(std::chrono::seconds(10));
io.lock();
std::cout << "Thread id: " << std::this_thread::get_id() << std::endl;
io.unlock();
});
futures.push_back(std::move(f));
}
for (auto& f : futures) {
f.wait();
}
}我在几个博客上读到,我不能使用async进行基于任务的并发,因为它不能在线程上均匀地分发tasks,所以我创建了一个小的测试程序。
Main id: 140673289357120
Thread id: 140673241089792
Thread id: 140673215911680
Thread id: 140673232697088
Thread id: 140673224304384
Thread id: 140673207518976
Thread id: 140673199126272
Thread id: 140673165555456
Thread id: 140673190733568
Thread id: 140673173948160
Thread id: 140673182340864
Thread id: 140673157162752
Thread id: 140673148770048但是输出并不是我所期望的。我的机器有两个超线程内核,它给了我4个线程,但是从线程ids来看,它们似乎都是独一无二的。
异步可以用于基于任务的并发吗?
this_thread::get_id()到底返回了什么?
所谓基于任务的并发性,我的意思是工作将在所有可用线程之间平均分配。
发布于 2018-10-15 05:50:44
12个唯一的线程ids指的是软件线程,而不是硬件线程。在Windows上的任务管理器面板(7或10)中,我看到了数以千计的线程,这些线程又是基于时间切片在可用硬件线程上并发执行的软件线程。
异步适用于基于任务的并发。这方面存在以下一些问题:
https://stackoverflow.com/questions/34413602
复制相似问题