
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Сообщ.
#1
,
|
|
|
Требуется обработку обмена данными с базой производить в одном потоке а обработку пользовательских действий в другом.В каком источнике приводится код реализации данной идеи на с++?
|
Сообщ.
#2
,
|
|
|
Синхронизируй 2 потока, через условие
|
Сообщ.
#3
,
|
|
|
Вот как вариант:
![]() ![]() #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> #include <string> #include <chrono> std::mutex mtx; // мьютекс для синхронизации доступа к базе данных std::condition_variable cv; // условная переменная для сигнализации о доступности новых данных в базе std::queue<std::string> data; // очередь для хранения данных из базы bool finished = false; // флаг для остановки потока обработки данных // функция для обработки базы данных в отдельном потоке void database_thread() { while (true) { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [](){ return !data.empty() || finished; }); // ожидание доступности новых данных или завершения работы if (finished && data.empty()) { return; } std::string item = data.front(); // получение новых данных из очереди data.pop(); lock.unlock(); // обработка данных из базы данных std::cout << "Processing item: " << item << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(500)); } } int main() { // запуск потока для обработки базы данных std::thread t(database_thread); // симуляция добавления новых данных в базу for (int i = 0; i < 10; i++) { std::string item = "Data item " + std::to_string(i); std::lock_guard<std::mutex> lock(mtx); data.push(item); cv.notify_one(); // оповещение потока о доступности новых данных } // ожидание завершения работы потока finished = true; cv.notify_one(); t.join(); return 0; } |