При попытке использовать функцию печати с блокировкой мьютекса у меня возникла такая идея:
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
также привязать ссылку? Кроме того, если бы я превратил его в пригодный для использования класс, это была плохая идея? [Edit] Это выглядит как плохая идея, так как есть проблема с синхронизацией. Я пытаюсь понять то же самое. Любые советы приветствуются. Полагаю, мне нужно более подробно изучить ссылки на r-значения.