Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 20.12.2020
Сообщений: 223
1

Mutex

13.07.2023, 22:33. Показов 2500. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как сделать класс log потоко-безопасным что-бы несколько потоков добавляли данные, а один их читал и выводил в консоль?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class log {
public:
    explicit log(std::string _fileName = "log.txt") {
        EnumUILanguagesA([](LPSTR _str, LONG_PTR _ptr) {
            setlocale(0, _str);
            return TRUE;
        }, MUI_LANGUAGE_NAME, 0);
 
        _File = std::fstream(_fileName, std::ios::app);
 
        if (!_File.is_open()) {
            throw std::exception("Failed open log file");
        }
 
        _QueueThread = boost::thread([this]() {
            while (1) {
                boost::shared_lock<boost::shared_mutex> lock_quard(_Mutex);
 
                size_t queue_size = _MessageQueue.size();
 
                if (queue_size) {
                    std::cout << _MessageQueue.front() << std::endl;
                    _File << _MessageQueue.front() << std::endl;
                    _MessageQueue.erase(_MessageQueue.begin());
                }
            }
        });
    }
 
    void message(std::string _message) {
        boost::lock_guard<boost::shared_mutex> lock_quard(_Mutex);
 
        std::time_t timet = 0;
        time(&timet);
 
        std::tm time = {};
        localtime_s(&time, &timet);
 
        std::string formated_message = std::format("[{}-{}-{} {}:{}:{}]->{}", time.tm_year + 1900, time.tm_mon, time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec, _message);
        _MessageQueue.push_back(formated_message);
    }
    void message(std::string _message, std::string _ipAddress) {
        boost::lock_guard<boost::shared_mutex> lock_quard(_Mutex);
 
        std::time_t timet = 0;
        time(&timet);
 
        std::tm* time = nullptr;
        localtime_s(time, &timet);
 
        std::string formated_message = std::format("[{}-{}-{} {}:{}:{}][{}]->{}", time->tm_year + 1900, time->tm_mon, time->tm_mday, time->tm_hour, time->tm_min, time->tm_sec, _ipAddress, _message);
        _MessageQueue.push_back(formated_message);
    }
 
    ~log() {
        try {
            _File.close();
            _QueueThread.detach();
        } catch (std::exception& e) {
            std::cout << std::format("Fatal error: ", e.what()) << std::endl;
        }
    }
 
private:
    std::fstream _File;
    std::vector<std::string> _MessageQueue;
    boost::shared_mutex _Mutex;
    boost::thread _QueueThread;
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2023, 22:33
Ответы с готовыми решениями:

boost::mutex взаимоблокировки
Псевдокод: void SomeClass::someMethod_1() { boost::mutex::scoped_lock lock( someMutex );...

Mutex
#include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include...

C++ mutex
Есть небольшое задание, буквально пару строк. Можете посмотреть, пожалуйста? Генератор чисел...

mutex
День добрый. Прошу объяснить мне дураку m_hShared = OpenMutex(MUTEX_ALL_ACCESS, TRUE,...

Mutex - синхронизация
У меня возник вопрос по мьютексам и их синхронизации, видимо, я не понимаю до конца механизм их...

0
13.07.2023, 22:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2023, 22:33
Помогаю со студенческими работами здесь

qt named mutex ?
Есть ли Qt именные мьютексы? То есть в winapi я могу открыть мьютекс по имени HANDLE hMutex =...

boost::mutex
Объясните пожалуйста зачем в данном примере(взятом из книги) нужны вот эти lock и unlock мьютекса...

Проблемы с <mutex>
Всем привет. Приступил я, значит, к изучению многопоточности в плюсах. И, как и все, дошел до темы...

Создать Mutex
Здравствуйте! Ребята подскажите. Хочу сделать блокировку на запуск повторного запуска своей...

C++ задача на mutex
Написать программу, позволяющую имитировать «идеальный экзамен». В экзамене может принимать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru