【发布时间】:2015-05-20 21:03:22
【问题描述】:
我有一个单线程应用程序,它通过调用 send_new_file 将文件发送到其他服务器
void send_new_file_command::start_sending_file()
{
m_thread = thread(&send_new_file_command::execute_file, this);
}
void send_new_file_command::execute_file()
{
for (auto it = files_need_to_send.begin(); it != files_need_to_send.end() && !is_complete(); ++it)
{
{
std::unique_lock<spinning_lock> guard(lock_obj);
m_current_file = *it;
}
// send a file.
// I want to call this in parallel
send_new_file(*it);
}
}
有什么方法可以让我拥有多个线程,每个线程分别发送一个文件。例如,假设我们有 4 个线程,线程 1、2、3、4 将并行发送不同的文件。我要同时拨打send_new_file?
我正在使用std::thread。我正在查看有关如何在 C++ 中执行此操作的线程示例,但很困惑如何在此处划分每个线程的文件数并确保每个线程都在文件子集上工作。
std::vector<std::thread> threads;
for (int i = 0; i < 4; ++i)
threads.push_back(std::thread(send_new_file(*it)));
我的背景是 Java,所以对如何使用 std::thread 在 C++ 中执行此操作有点困惑。
【问题讨论】:
-
我很困惑你的问题是什么。难道你不能简单地让每个线程从列表中抓取文件,直到该列表最终变为空,线程实现并关闭?你能展示(简化的)代码你将如何用Java解决这个问题吗?它应该非常直接地转换为 C++11。顺便说一句,这个锁有什么用?
-
当您说“发送新文件”时......您将文件发送到哪里,它来自哪里?例如,如果您通过网络发送所有这些文件并且可以从内存中获取它们,那么您很可能会受到网络速度的限制,因此一次发送多个文件不会加快您的总吞吐量。此外,如果您从同一个 HDD 获取文件,一次读取它们可能会导致非 SSD 上的 HDD 抖动,并且会大大降低您读取它们的速度。所以最好的办法是一次读取一个连续的文件。多线程并不总是更快。
-
我们有 SSD 运行,所有 raid0 没有镜像。我想试试这个,看看它是否有任何改进。
标签: c++ multithreading stdthread