Ведение журнала C ++ с использованием ostream - PullRequest
0 голосов
/ 15 февраля 2012

Я делаю регистратор. Я хочу создать функцию log(), которая принимает поток в качестве входных данных.

Например:

log("hello"<<" "<<"world"<<10<<"\n");

Я также хочу, чтобы он был безопасным для потоков.

Я переопределил оператор <<, чтобы я мог сделать:

log()<<"hello"<<"world"<<10<<"\n"

Но эта операция не является поточно-ориентированной.

Как я могу сделать это потокобезопасным?

Ответы [ 3 ]

9 голосов
/ 15 февраля 2012

У log() возвращен временный объект, который буферизует весь вывод в памяти.Деструктор для этого объекта будет выполняться в конце выражения и должен сбрасывать накопленные данные в реальный поток за одну атомарную операцию (до вас, чтобы сделать эту операцию атомарной).

Это сделает вашВозможен второй синтаксис:

log()<<"hello"<<"world"<<10<<"\n";
1 голос
/ 15 февраля 2012

Вы не можете создать функцию, подобную той, которую вы хотите. Тем не менее, вы можете создать макрос, который обрабатывает эти вещи для вас:

// "log" may be defined in the <cmath> header file
// so undefine it if needed
#ifdef log
# undef log
#endif
#define log(stream)          \
    do {                     \
        acquire_lock();      \
        std::cout << stream; \
        release_lock();      \
    } while(0)

Вы должны изменить acquire_lock и release_lock на те, которые вам нужны. И, конечно же, используйте подходящий вам поток.

0 голосов
/ 15 февраля 2012

в C ++ 03 все операции не являются потокобезопасными

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