在尝试一些互斥锁打印功能时,我有一个这样的想法:
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 值引用。