Tôi là người mới đến thư viện Boost và đang cố triển khai một luồng sản xuất và tiêu dùng đơn giản hoạt động trên hàng đợi được chia sẻ. Ví dụ thực hiện của tôi trông như thế này:Sử dụng boost :: lock_guard để khóa dữ liệu chia sẻ đơn giản
#include <iostream>
#include <deque>
#include <boost/thread.hpp>
boost::mutex mutex;
std::deque<std::string> queue;
void producer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);
std::cout << "producer() pushing string onto queue" << std::endl;
queue.push_back(std::string("test"));
}
}
void consumer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);
if (!queue.empty()) {
std::cout << "consumer() popped string " << queue.front() << " from queue" << std::endl;
queue.pop_front();
}
}
}
int main()
{
boost::thread producer_thread(producer);
boost::thread consumer_thread(consumer);
sleep(5);
producer_thread.detach();
consumer_thread.detach();
return 0;
}
Mã này chạy như tôi mong đợi, nhưng khi main
thoát, tôi nhận được
/usr/include/boost/thread/pthread/mutex.hpp:45:
boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed.
consumer() popped string test from queue
Aborted
(Tôi không chắc chắn nếu đầu ra từ consumer
là có liên quan trong đó vị trí, nhưng tôi đã để nó vào.)
Tôi có làm điều gì sai trong việc sử dụng Boost không?
Tôi không cố gắng viết bất kỳ loại ứng dụng cụ thể nào — tôi chỉ đang cố gắng làm quen với thư viện Boost.Thread. Các cuộc gọi đến 'tách 'được đưa vào trong một phiên gỡ lỗi nhanh; hành vi là giống hệt nhau nếu tôi xóa chúng.Ban đầu tôi nghi ngờ rằng các chủ đề cần phải được dừng lại trước khi chương trình đã thoát, do đó các cuộc gọi 'tách '. – kfb
Không thoát khỏi chủ đề chính ngay lập tức và không tách người tiêu dùng và nhà sản xuất. Đợi trong chuỗi chính cho đến khi người tiêu dùng và nhà sản xuất của bạn hoạt động. Và khi họ kết thúc họ. Và sau đó thoát khỏi chính. –
Điều đó có ý nghĩa và không ngừng khẳng định, cảm ơn! – kfb