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的变量(条件)是一种容易出错的方法,因为。给出了很好的解释。