【发布时间】:2016-08-20 08:40:58
【问题描述】:
我目前正在学习 c++11 中引入的多线程特性,当我筛选几个 SO 问题时,我发现多线程在执行指令的同时会带来自己的开销。所以我写了一个简单的程序来比较黑白顺序和多线程解决方案。结论并没有让我感到惊讶,顺序比多线程快得多,可能是因为它不必处理线程的创建和管理。
但是现在对于另一个问题,顺序方法会阻塞整个程序,多线程可能会占优势 -
input.txt
DEVICE#1 4
DEVICE#2 5
DEVICE#3 10
DEVICE#4 1
DEVICE#1 1
prog_seq.cpp
#include <chrono>
#include <fstream>
#include <iostream>
#include <string>
#include <thread>
using string = std::string;
using namespace std::this_thread; // sleep_for
void executor(string name, int delay)
{
sleep_for(std::chrono::seconds(delay));
std::cout << name << std::endl;
}
int main()
{
string deviceName = "";
int delay = 0;
std::ifstream in("input.txt");
while (in >> deviceName >> delay) {
executor(deviceName, delay);
}
return 0;
}
Output
DEVICE#1
DEVICE#2
DEVICE#3
DEVICE#4
DEVICE#1
real 0m21.004s
user 0m0.000s
sys 0m0.000s
这个程序至少需要 21 秒才能完成,而下面的程序可能会在 11 秒内完成-
prog_thread.cpp
#include <chrono>
#include <fstream>
#include <iostream>
#include <string>
#include <thread>
#include <vector>
using string = std::string;
using namespace std::this_thread; // sleep_for
void executor(string name, int delay)
{
sleep_for(std::chrono::seconds(delay));
std::cout << name << std::endl;
}
int main()
{
std::vector<std::thread> threadStore;
string deviceName = "";
int delay = 0;
std::ifstream in("input.txt");
while (in >> deviceName >> delay) {
threadStore.emplace_back(std::thread(executor, deviceName, delay));
}
for (auto &t : threadStore) {
t.join();
}
return 0;
}
Output
DEVICE#1
DEVICE#4
DEVICE#1
DEVICE#2
DEVICE#3
real 0m10.003s
user 0m0.000s
sys 0m0.000s
所以我知道,对于此类程序,多线程实际上会受益,因为它们会以最短的顺序完成,因为它们的切换方式很好(如果它们的数量增长高于核心)。
现在我想问的是,对于这样的程序,每个线程都在执行相互独立的任务,这些任务并不完全是 cpu 密集型,而是更多地依赖于等待来自外部系统的输入或响应/人类,多线程的开销在这里仍然适用吗?假设我有 50 个线程都在等待来自 50 个客户端的输入,并且由于它们不忙于执行 cpu 密集型任务,与顺序执行中的某种计时器相比,这将是一个更好的解决方案(它保持300 毫秒后一次又一次地检查输入)。
此外,是否有更多替代方法来处理此类问题,因为我很想了解它们。
【问题讨论】:
-
“假设我有 50 个线程都在等待来自 50 个客户端的输入” 这是许多 Web 服务器程序的情况,它们通常有一个线程池,其中一个线程使用每个单独的连接。除此之外,我担心你的问题太宽泛,无法在这里简明扼要地回答。因素太多了。
-
@πάνταῥεῖ by threadpool 您指的是自行创建的固定数量的线程吗?还是由操作系统管理的某种线程池?
-
通常线程池是在程序中自己创建的。
-
我想了解这些因素本身。有什么资源可以阅读吗?除了我做过的幼稚示例之外,任何可以衡量这些开销的工具。我的知识限制了我直到这里,这就是我在 SO 上问这个问题的原因。
-
不幸的是,在这里要求第三方资源或工具是题外话。
标签: c++ linux multithreading performance c++11