C++ 在没有系统调用的线程之间使用std::istream和std::ostream(管道)

C++ 在没有系统调用的线程之间使用std::istream和std::ostream(管道),c++,multithreading,c++11,C++,Multithreading,C++11,我正在寻找一种使用语义在线程之间创建通信流的简单方法。我正在寻找类似以下内容的内容: #include <iostream> #include <thread> void thread1(std::istream from_main, std::ostream to_main) { std::string s; from_main >> s; to_main << "Received:" << s <&l

我正在寻找一种使用
语义在线程之间创建通信流的简单方法。我正在寻找类似以下内容的内容:

#include <iostream>
#include <thread>

void thread1(std::istream from_main, std::ostream to_main) {
    std::string s;
    from_main >> s;
    to_main << "Received:" << s << std::endl;
}
int main() {
   std::istream from_thread;
   std::ostream to_thread;
   std::thread t(thread1, to_thread, from_thread);
   to_thread << "Hi-Thread\n";
   std::string s;
   from_thread >> s; // Received:Hi-Thread
   t.join();
}
#包括
#包括
空螺纹1(标准::istream从_main,标准::ostream到_main){
std::字符串s;
从_main>>s;

看起来你需要的是一个单一生产者、单一消费者(SPSC)队列,可能是无锁的。我首先要说的是,如果你觉得有强烈的需要建立语法糖来生成
operator,看起来你需要的是一个单一生产者、单一消费者(SPSC)队列,可能是无锁的。我从这开始,如果你觉得非常需要建立语法糖来生成
操作符,我很好奇为什么你需要管道、FD和系统调用来完成这项工作?所有的事情都在同一个过程中,所以你可以有一个消息队列和一个锁,对吗?这里的用例是什么?@ggorlen True,但我错过了整个
std::stream
语义,非常好。您的队列可以覆盖
运算符。@ggorlen我当然可以,但这可能会给我带来各种各样的错误。如果没有更标准的解决方案,我会感到非常惊讶。似乎这将是合理的很快定义一个具有必要行为的
std::streambuf
子类。你可以构造一个引用它的istream和ostream。我很好奇为什么你需要管道、FD和系统调用来做这件事?所有的东西都在同一个过程中,所以你可以有一个消息队列和一个锁,对吗?用例是什么这里?@ggorlen是的,但是我错过了整个
std::stream
语义,这很好。你的队列可以覆盖
操作符。@ggorlen我当然可以,但这会给我带来各种各样的错误。如果没有更标准的解决方案,我会非常惊讶似乎直接定义一个具有必要行为的
std::streambuf
子类是合理的。您可以构造一个引用它的istream和ostream。