2015-03-25 2 views
0

Я понимаю, что this question похож, но мой не относится к Windows.Безопасно ли объявлять мьютексы в области файлов?

Это безопасная и хорошая форма для объявления мьютекса в области файлов как так?

#include <iostream> 
#include <mutex> 
#include "Logger.h" 

mutex my_mutex; 

void Logger::log() 
{ 
    lock_guard<mutex> lock(my_mutex); 
    for (int i = 0; i < 29; ++i) 
    { 
     cout << i << " "; 
    } 
    cout << endl; 
} 
+3

* Я хочу синхронизировать на уровне экземпляра, а не через экземпляры. * Затем мьютексом должен быть нестатический член данных класса Logger. Глобальный мьютекс, который у вас есть сейчас, делает именно то, что вы говорите, что вы ** не хотите делать. – Praetorian

+2

Чтобы обеспечить использование файловой области, используйте 'static' для объявления вашего мьютекса. Проблема: * file-scope * является антиномическим с * уровнем экземпляра *; что ты конкретно имеешь ввиду ? –

+0

Отредактировал вопрос. Я понимаю, что мой код будет синхронизироваться между экземплярами. Хорошо. Благодарю. – Gareth

ответ

3

Чтобы действительно ограничить это файл сферы в современном стиле C++:

namespace { 
    mutex my_mutex; 
    <information to protect goes here> 
} 

Тогда ответ «да это безопасно».

В вашем случае, однако, похоже, что вы пытаетесь защитить std :: cout. Поскольку cout не ограничивается областью вашего файла, ваш мьютекс не принесет много пользы, если вы не можете гарантировать, что это единственное использование cout и/или cerr во всей программе.

Смежные вопросы