Использование std :: move over ofstream - PullRequest
0 голосов
/ 15 февраля 2020

При попытке использовать функцию печати с блокировкой мьютекса у меня возникла такая идея:

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-значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...