0

在尝试一些互斥锁打印功能时,我有一个这样的想法:

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

看来我没有设法移动std::cout,因为下一行仍然有效。发生了什么事?std::move还可以绑定参考吗?另外,如果我要把它变成可用的类,这是一个坏主意吗?[编辑]这看起来确实是个坏主意,因为同步存在问题。我试图理解相同。任何提示都是最受欢迎的。我想,我需要更深入地研究 r 值引用。

4

0 回答 0