VẤN ĐỀ:giải pháp thông minh để lưu trữ dữ liệu để xml thread-safe với Boost
Tôi đang phát triển một máy chủ với Boost và có một tập tin xml từ đó một số dữ liệu được tải bởi các chủ đề chính lúc khởi tạo .
Trong khi thực hiện, một số thay đổi có thể xảy ra và phải được lưu trữ trong tệp xml. Với mục đích này một cửa hàng function() được thực hiện trong một lớp được gọi là cơ sở dữ liệu:
Database::store()
{
boost::mutex::scoped_lock lock(_databaseMutex);
//xml file wirting
}
Nếu tôi muốn lưu thay đổi từ một thread khác nhau từ chính người đã tạo ra cơ sở dữ liệu lớp (kết nối ổ cắm, ví dụ), xml không thành công vì có vẻ như chuỗi không an toàn. giải pháp
posible:
Ý tưởng của tôi là tạo ra một vòng lặp trong máy chủ (chủ đề chính) chờ đợi thông báo từ chủ đề khác, một cái gì đó như thế này:
void loopQueue()
{
boost::mutex::scoped_lock lock(_queueMutex); // close the lock
while(true)
{
while (_queuedActions.empty())
{
_updateAvailable.wait(lock);
}
getDatabase(param)->store(); //stores database
_queuedActions.pop();
}
}
Bằng cách này xml viết không không sụp đổ.
Câu hỏi:
- Có một giải pháp hiệu quả hơn hoặc tốt hơn cho loại vấn đề hoặc đây là đúng cách?
Tôi đọc về vấn đề này chủ đề ngay bây giờ, có vẻ thú vị, cũng cho một chuỗi cho mỗi kết nối. –
Cách tốt nhất là sử dụng hồ bơi chủ đề. Việc sinh ra một chuỗi cho mỗi kết nối không được mở rộng nếu máy chủ của bạn cần xử lý một số lượng lớn các kết nối khác nhau (ví dụ: một chuyển đổi VOIP xử lý 1000 cuộc gọi). Các ví dụ được cung cấp với 'boost :: asio' bao gồm cả các kịch bản đơn giản và phức tạp, không may một số kịch bản phức tạp hơn không được giải thích/ghi lại.Có một số tài nguyên tuyệt vời ở đây, giải thích các kỹ thuật khác nhau để phát triển các máy chủ đa luồng với 'boost :: asio'. IMHO 'boost :: asio' là một trong những thư viện C++ được sử dụng tốt nhất/dễ sử dụng nhất. – mark