- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试用 C++ 编写一个程序,以尽可能最快的方式处理大量数据包。来自标准的所有数据包都应尽可能快地读取,从池中发送到一个线程进行处理,然后处理到将数据包写入标准输出的输出线程。
当您在 C++ 中使用标准输入和输出时,建议在任何输入或输出之前调用 std::ios_base::sync_with_stdio(false)功能。在某些环境中,这实现了很大的加速,但您应该避免在调用后使用标准 C 函数进行输入/输出。
好吧,这似乎在单线程中工作得很好。但正如我所说,我的意图是使用一个线程用于输入,一个用于输出,多个线程用于并行处理。我观察到输出存在一些问题。这是输出线程(非常简化):
void PacketDispatcher::thread_process_output(OutputQueue& output_queue) {
std::vector<Packet> packet_list;
while(output_queue.get(packet_list)) {
for (const auto& packet: packet_list) {
std::cout << "Packet id = " << packet.id << "\n";
}
}
std::cout.flush();
}
如果我使用 std::endl 而不是 "\n" 则损坏较少,但 std::endl 强制刷新流,影响性能这种情况(问题没有解决,只是最小化)。
这是程序中使用 std::cout 的唯一一点,但如果我调用 std::ios_base::sync_with_stdio(false)在程序开始时,我得到了明显的加速,但我的输出总是以某种方式损坏:
Packet id = Packet id = 4
Packet id = 5
Packet id = 6
Packet id = 7
Packet id = 8
Packet id = 9
Packet id = 10
那么,问题出在哪里呢? C++ 不能使用快速标准输入/输出进行多线程处理吗?
最佳答案
我终于找到了罪魁祸首。如果您在 Internet 上搜索,很多网站都建议使用 sync_with_stdio 调用,但他们没有谈论线程。
其他站点谈论 iostream 和线程,例如 this one ,但这并不能解释为什么当我在仅一个线程中使用 std::cin 而在 它自己的线程 中使用 std::cout 时输出被破坏.
问题是在内部,std::cin 输入线程正在调用 std::cout 来刷新它的缓冲区,但是由于流没有与互斥量或类似的东西同步,输出被破坏了。如果它们在做不同的事情,我为什么要同步缓冲区?为什么 std::cin 与 std::cout 混淆?
在 C++ 中,默认情况下,标准流 cin、cerr 和 clog 与 cout 相关联。这是什么意思?这意味着当你尝试从 cin 读取时,首先它会强制刷新到 cout。有时这很有用,因为您可以阅读 here .
但在我的例子中,这导致了一些严重的问题,那么,如何解开流呢?。使用 tie method 非常容易:
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cerr.tie(nullptr);
或者如果您的编译器不支持 C++11:
std::ios_base::sync_with_stdio(false);
std::cin.tie(static_cast<ostream*>(0));
std::cerr.tie(static_cast<ostream*>(0));
有了这个改变,我的输出现在是正确的:
Packet id = 1
Packet id = 2
Packet id = 3
Packet id = 4
Packet id = 5
Packet id = 6
Packet id = 7
Packet id = 8
Packet id = 9
Packet id = 10
并且因为它避免了每次使用 std::cin 时都进行刷新,所以它也更快 :-)
关于c++ - C++、cin、cout、threads 和 sync_with_stdio 的损坏输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14010147/
这里说的是http://en.cppreference.com/ “如果关闭同步,则允许 C++ 标准流独立缓冲其 I/O,这在某些情况下 可能会快得多。” 那些情况是什么? 最佳答案 如果您想要同步
看这个例子: #include #include int main() { std::ios::sync_with_stdio(false); std::cout << "a";
我为Eratosthenes筛子编写了此代码,但它在ios_base::sync_with_stdio(false);上给出了编译时错误。 当我删除该行时,代码正在执行。 #include using
我想知道为什么下面的代码没有按预期工作: #include #include using namespace std; int main(){ int n; string s;
两者都是this answer关于 Stack Overflow 和 cppreference.com建议关闭流同步以提高性能,认为流同步会禁用缓冲。 这就是我不明白的地方。为什么同步流不能简单地共享
出于某种原因,我无法使我的输出流使用该行运行得更快 std::ios_base::sync_with_stdio(false); 包含在我程序的开头。我正在用这两个程序对此进行测试: #include
#include #include int main () { std::ios::sync_with_stdio(false); std::cout 当 C stdio 与 C++ 标
这是否仅仅意味着我们对诸如 cout 之类的对象所做的任何事情都会与 stdout 同步(反之亦然?)。这到底是什么意思。 stdio 是否也与 stdout 同步? 最佳答案 如果关闭同步,C++
如果我写: #include using namespace std; main(){ ios::sync_with_stdio(false); cout using namesp
所以,我正在研究一些让我的代码运行得更快的方法,我发现 printf 比 cout 更快。但是,我看到了 std::ios::sync_with_stdio(false);通过去同步化使 cout 更
众所周知ios_base::sync_with_stdio(false)将有助于 中 cin 和 cout 的性能通过防止同步 b/w C 和 C++ I/O。但是,我很好奇它是否对 有任何影响。
我正在尝试用 C++ 编写一个程序,以尽可能最快的方式处理大量数据包。来自标准的所有数据包都应尽可能快地读取,从池中发送到一个线程进行处理,然后处理到将数据包写入标准输出的输出线程。 当您在 C++
包含有什么意义 ios_base::sync_with_stdio(false); cin.tie(NULL); 在 C++ 程序中? 在我的测试中,它加快了执行时间,但是我应该担心包含这个的测试用例
这是一个简单的代码: #include using namespace std; int main() { ios::sync_with_stdio(false); int t,n;cin>>t;
clock_t tStart = clock(); ios::sync_with_stdio(0); cin.tie(0); for(int i=0;i<100000;++i) cout<
让我们看一下这个代码示例: #include int main() { std::ios_base::sync_with_stdio(false); int n; std::
我给出的输入是 5 1 1 1 1 1 有人可以向我解释这种行为吗? 我实际上是在一次在线编程竞赛中发现的。我得到错误的答案判决。虽然在我的电脑上它运行良好,但在线 IDE 出现运行时错误(总线错误)
我只知道使用 cin 和 cout 会比 scanf 和 printf 慢。然而,the top answer说使用 std::ios::sync_with_stdio(false) 比 scanf&
考虑下面的简单代码: #include #include #include void print_vector( const std::vector &inputVector ) { s
我是一名优秀的程序员,十分优秀!