C++ std::线程间的stringstream不';I don’我没有按预期工作

C++ std::线程间的stringstream不';I don’我没有按预期工作,c++,multithreading,iostream,C++,Multithreading,Iostream,我正在使用std::iostreams在线程之间发送流数据,但正在努力提取数据,下面是一个人为的示例: #include <sstream> #include <iostream> #include <thread> #include <chrono> #include <atomic> #include <mutex> using namespace std::chrono_literals; int main() {

我正在使用
std::iostreams
在线程之间发送流数据,但正在努力提取数据,下面是一个人为的示例:

#include <sstream>
#include <iostream>
#include <thread>
#include <chrono>
#include <atomic>
#include <mutex>

using namespace std::chrono_literals;

int main()
{
    auto stream = std::stringstream{};
    auto stop = std::atomic_bool{false};
    auto mtx = std::mutex{};

    auto thread = std::thread{[&]() {
        while(!stop) {
            auto lock = std::lock_guard{mtx};
            if (stream.peek() != decltype(stream)::traits_type::eof()) {
                auto str = std::string{};
                stream >> str;
                std::cout << str;
            }
        }
    }};

    {
        // Make sure thread is running before sending data
        std::this_thread::sleep_for(100ms);
        {
            auto lock = std::lock_guard{mtx};
            stream << "hello" << std::endl;
        }

        // Give the thread a chance to receive it
        std::this_thread::sleep_for(100ms);
    }

    stop = true;
    thread.join();

    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括

#include,不产生输出-调试表明
stream.peek()
始终是
EOF
。我一定是做错了什么,但我看不出来

这个问题是由这样一个事实引起的,即您在读取数据之前,还没有任何东西可以读取(它是被写入的)

当您尝试从空流中读取数据时,将设置错误标志,并且在清除错误标志之前,不会对此类流执行任何后续读/写操作

你需要一些能确保在写作后阅读的东西<代码>标准::条件变量可以做到这一点

intmain()
{
自动流=std::stringstream{};
自动mtx=std::互斥{};
auto hasData=std::condition_变量{};
auto readingStarted=std::condition_变量{};
自动线程=std::线程{[&](){
std::unique_lock lock{mtx};
readingStarted.notify_one();
hasData.wait(锁);
auto str=std::string{};
stream>>str;

std::cout这个问题是由这样一个事实引起的,即您在读取任何数据之前(它是被写入的)

当您尝试从空流中读取数据时,将设置错误标志,并且在清除错误标志之前,不会对此类流执行任何后续读/写操作

您需要一些能够确保在写入之后进行读取的东西。
std::condition\u variable
可以做到这一点

intmain()
{
自动流=std::stringstream{};
自动mtx=std::互斥{};
auto hasData=std::condition_变量{};
auto readingStarted=std::condition_变量{};
自动线程=std::线程{[&](){
std::unique_lock lock{mtx};
readingStarted.notify_one();
hasData.wait(锁);
auto str=std::string{};
stream>>str;

std::难道我没有在实际代码中使用休眠…但是关于错误标志,你是对的,我没有意识到它们需要手动清除。更多的是关于同步而不是清除标志。@cmannett85,请不要在生产中使用此答案中的示例作为模板。使用没有共享变量(条件)的是一种容易出错的方式,原因是。给出了很好的解释。我没有在实际代码中使用sleep…但是关于错误标志,您是对的,我没有意识到它们需要手动清除。这更多是关于同步而不是清除标志。@cmannett85,请不要在生产中使用此答案中的示例作为模板。使用没有共享v的变量(条件)是一种容易出错的方法,因为。给出了很好的解释。