2012-11-15 29 views
8

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?

Trả lời

3

Tất cả phụ thuộc vào chủ đề chính đang làm và cách chương trình được thiết kế và triển khai.

Giải pháp mà bạn đề xuất sẽ hoạt động tốt nhưng nó chứa một chuỗi duy nhất chỉ để xử lý ghi vào tệp xml.

Bạn có quen thuộc với boost::asio không?

Trong bất kỳ máy chủ nào, tôi sẽ sử dụng boost::asio với một chủ đề hoặc một nhóm chủ đề gọi là ioservice::run. Các bản cập nhật cho tệp xml được "đăng" lên vòng lặp sự kiện asio và được gửi đi/được thực hiện bởi bất kỳ luồng công nhân nào trong luồng của nó (tức là các chủ đề được gọi là ioserive :: run). Điều này có nghĩa là hệ thống của bạn sử dụng ít chuỗi hơn và các chuỗi mà nó đang sử dụng có khả năng thực hiện nhiều thao tác không đồng bộ.

Lưu ý: boost::asio::post được sử dụng để có một hàm gọi trong vòng lặp sự kiện ASIO, điều này cho phép bạn kiểm soát/serialize truy cập vào các tập tin xml

Xem: boost::asio boost::asio::post

+1

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. –

+1

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

Các vấn đề liên quan