无法使用提升信号量构建应用程序

时间:2014-07-25 17:23:18

标签: c++ boost

所以我正在尝试使用boost来实现阻塞队列,但这件事无法编译......

template<class T>
class BlockingQueue {
private:
    std::queue<T> blockedQueue;
    boost::interprocess::interprocess_semaphore *counter;

public:
    BlockingQueue(){
        counter = new boost::interprocess::interprocess_semaphore(0);
    }
    virtual ~BlockingQueue(){
        delete counter;
    }

    /**
     * puts blockingly an element to the queue
     */
    void put(T element) {
        this->blockedQueue.push(element);
        this->counter->post();
    }

    /**
     * blocingly reads an element fromt he queue
     */
    T* get(){
        this->counter->wait();
        T* result = &this->blockedQueue.front();
        this->blockedQueue.pop();
        return result;
    }

};

然后出于测试目的,我只添加了我的主要功能

BlockingQueue<int>i;
    i.get();

然而,当我尝试编译它时,我得到了以下错误:

  

./ src / Test.o:在功能上   boost::interprocess::ipcdetail::semaphore_init(sem_t*, unsigned int)': /usr/include/boost/interprocess/sync/posix/semaphore_wrapper.hpp:129: undefined reference to sem_init'./src/Test.o:功能正常   boost::interprocess::ipcdetail::semaphore_destroy(sem_t*)': /usr/include/boost/interprocess/sync/posix/semaphore_wrapper.hpp:140: undefined reference to sem_destroy'./src/Test.o:在函数中   boost::interprocess::ipcdetail::semaphore_wait(sem_t*)': /usr/include/boost/interprocess/sync/posix/semaphore_wrapper.hpp:156: undefined reference to sem_wait'

用于编译我使用“g ++ -c -fmessage-length = 0 -std = c ++ 11 -pthread -lrt” 所以...我做错了什么?

1 个答案:

答案 0 :(得分:1)

进程间库在documentation

中特别提到了这一点
  

在POSIX系统中,Boost.Interprocess使用pthread系统调用   实现类,如互斥,条件变量等......在某些方面   在操作系统中,这些POSIX调用是分开实现的   未由编译器自动链接的库。对于   例如,在某些Linux系统中实现了POSIX pthread功能   在librt.a库中,因此您可能需要在链接时添加该库   使用Boost.Interprocess的可执行文件或共享库。如果你   请获取与那些pthread函数相关的链接错误   修改系统的文档以了解哪个库实现了   它们。

在Linux上,link with -pthread.