C++ 使用std::在流上移动

C++ 使用std::在流上移动,c++,mutex,ofstream,stdmove,C++,Mutex,Ofstream,Stdmove,在尝试一些互斥锁打印功能时,我得到了如下想法: class MyWriteStream { public: MyWriteStream(std::ostream &stream) : stream_(std::move(stream)) {} void write(const char *str, const size_t size) { std::lock_guard<std::mutex> lock(mutex_);

在尝试一些互斥锁打印功能时,我得到了如下想法:

class MyWriteStream
{
public:
    MyWriteStream(std::ostream &stream) : stream_(std::move(stream)) {}

    void write(const char *str, const size_t size)
    {
        std::lock_guard<std::mutex> lock(mutex_);
        stream_.write(str, size);
    }

    friend MyWriteStream & operator << (MyWriteStream &out, const char *c);

private:
    std::ostream &&stream_;
    std::mutex mutex_;
};

MyWriteStream & operator << (MyWriteStream &out, const char *c)
{
    out.write(c, strlen(c) * sizeof(char));
    return out;
}
MyWriteStream stream(std::cout);
auto blah = [&stream](const char *s) {
    stream << s << "\n";
};
std::vector<std::thread> threads;
for (auto i = 0; i<10; ++i) {
    std::string str = "blah : " + std::to_string(i);
    threads.push_back(std::thread(blah, str.c_str()));
}
for (auto &thread : threads) {
    thread.join();
}

std::cout << "hello" << std::endl;  // Still Works
类MyWriteStream
{
公众:
MyWriteStream(std::ostream&stream):流(std::move(stream)){}
无效写入(常量字符*str,常量大小\u t大小)
{
std::锁\保护锁(互斥锁);
流写入(str,size);
}

friend MyWriteStream&operator
std::move
不移动。请参阅。我跟踪到了资源管理问题。问题是调用方。指针str.c_str()在创建线程之前很久就被销毁了。假设本地的堆栈空间相同,这是命中或未命中的。我将其更改为RAII std::string,它似乎可以工作!