代码之家  ›  专栏  ›  技术社区  ›  kfb

使用boost::lock\u guard实现简单的共享数据锁定

  •  14
  • kfb  · 技术社区  · 15 年前

    #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;
    }
    

    这段代码按照我的预期运行,但是什么时候呢 main 出口,我明白了

    /usr/include/boost/thread/pthread/mutex.hpp:45:    
        boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed.
    consumer() popped string test from queue
    Aborted
    

    (我不确定 consumer 在那个职位上是相关的,但我把它留在了。)

    我在使用Boost时是不是做错了什么?

    3 回复  |  直到 15 年前
        1
  •  8
  •   user184968 user184968    15 年前

    您为您的线程(生产者和消费者)提供 mutex 对象,然后分离它们。他们应该永远跑下去。然后你退出你的程序 互斥

    您是否正在尝试编写守护程序应用程序,这就是分离线程的原因?

        2
  •  11
  •   Steve Townsend    15 年前

    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();
            }
        }
    }
    

    最终,您很可能会为队列构建(或者更好地,如果可用的话,重用)代码,当需要工作人员执行工作时,它会向工作人员发出信号,然后您将使用 lock_guard 在您的工作线程内部调解对共享数据的访问。

        3
  •  5
  •   doron    15 年前

    main 退出时,所有全局对象都将被销毁。但是,您的线程确实会继续运行。因此,最终会出现问题,因为线程正在访问已删除的对象。

    底线是您必须在退出之前终止线程。但唯一要做的是让主程序等待(通过使用 boost::thread::join )直到线程运行完毕。您可能需要提供一些方法来通知线程完成运行,以避免等待太久。

    另一个问题是,即使没有数据,用户线程也会继续运行。你可能想等一个 boost::condition_variable