你如何在C++中启动多个线程
How do you start more than one thread in C++
我在 class
上有以下方法
void Listener::Start()
{
Logger logger;
std::string logMessage("Starting '" + to_utf8string(GetName()) + "' Listener");
http_listener httpListener(GetUri());
std::string listenerName(to_utf8string(name));
logger.log(logMessage);
// listener recieves a GET request.
httpListener.support(methods::GET, [listenerName](http_request request)
{
Logger logger;
std::string logMessage("GET request recieved from " + listenerName);
logger.log(logMessage);
// dummy line just till routing is dealt with
request.reply(status_codes::OK, logMessage);
});
// open listener and route request
httpListener
.open()
.then([&httpListener,listenerName](){
Logger logger;
std::string logMessage(listenerName + "started");
logger.log(logMessage);
}).wait();
// JUST WAIT - we do not want the application to stop
while (true);
}
现在我不知道有多少个线程 - 它基本上只是从数据库中读取的记录数 table。
for each (Listener l in ls.Select(m.GetId()))
{
l.Start();
}
只有第一个线程被启动并且 运行s,这是合乎逻辑的,因为从 运行ning 停止线程的唯一事情是一个永久循环。
但是如果是运行这样;
std::vector<thread> listener_threads;
for each (Listener l in ls.Select(m.GetId()))
{
listener_threads.push_back(thread{ &Listener::Start, &l });
}
None 的线程似乎是 运行ning - none 的听众回复任何请求。
所以问题是如何在 C++ 应用程序中 运行 不确定数量的线程。
这样做的方法是首先将所有侦听器实例收集在一个向量中。然后循环遍历这个向量,用实际线程创建另一个向量。
// collect all the listeners into a vector
for (auto& m : rm.Select()) {
for (auto& l : ls.Select(m.GetId())) {
lvector.push_back(l);
}
}
// now create threads for each listener
for (auto& lstnr : lvector)
{
listener_threads.push_back(std::thread{ &Listener::Start, &lstnr });
}
// now join with this thread.
for (auto& t : listener_threads)
{
t.join();
}
因为我在每个线程的底部都有一段时间(真)- 然后应用程序继续 运行,同时监听所有必需的域。
我认为作用域可能存在问题,因为 lvector 需要在 for 循环之外并且它们都被添加了。
我在 class
上有以下方法void Listener::Start()
{
Logger logger;
std::string logMessage("Starting '" + to_utf8string(GetName()) + "' Listener");
http_listener httpListener(GetUri());
std::string listenerName(to_utf8string(name));
logger.log(logMessage);
// listener recieves a GET request.
httpListener.support(methods::GET, [listenerName](http_request request)
{
Logger logger;
std::string logMessage("GET request recieved from " + listenerName);
logger.log(logMessage);
// dummy line just till routing is dealt with
request.reply(status_codes::OK, logMessage);
});
// open listener and route request
httpListener
.open()
.then([&httpListener,listenerName](){
Logger logger;
std::string logMessage(listenerName + "started");
logger.log(logMessage);
}).wait();
// JUST WAIT - we do not want the application to stop
while (true);
}
现在我不知道有多少个线程 - 它基本上只是从数据库中读取的记录数 table。
for each (Listener l in ls.Select(m.GetId()))
{
l.Start();
}
只有第一个线程被启动并且 运行s,这是合乎逻辑的,因为从 运行ning 停止线程的唯一事情是一个永久循环。
但是如果是运行这样;
std::vector<thread> listener_threads;
for each (Listener l in ls.Select(m.GetId()))
{
listener_threads.push_back(thread{ &Listener::Start, &l });
}
None 的线程似乎是 运行ning - none 的听众回复任何请求。
所以问题是如何在 C++ 应用程序中 运行 不确定数量的线程。
这样做的方法是首先将所有侦听器实例收集在一个向量中。然后循环遍历这个向量,用实际线程创建另一个向量。
// collect all the listeners into a vector
for (auto& m : rm.Select()) {
for (auto& l : ls.Select(m.GetId())) {
lvector.push_back(l);
}
}
// now create threads for each listener
for (auto& lstnr : lvector)
{
listener_threads.push_back(std::thread{ &Listener::Start, &lstnr });
}
// now join with this thread.
for (auto& t : listener_threads)
{
t.join();
}
因为我在每个线程的底部都有一段时间(真)- 然后应用程序继续 运行,同时监听所有必需的域。
我认为作用域可能存在问题,因为 lvector 需要在 for 循环之外并且它们都被添加了。