从成员类函数创建线程

时间:2017-03-13 07:45:29

标签: c++ multithreading boost

这是我的class.h

class threads_queue{
private:
    boost::condition_variable the_condition_variable;
public:
    //boost::atomic<bool> done;
    boost::lockfree::spsc_queue<std::pair<char, std::string>> q{100};
    //threads_queue() : done(false) {};
    void static run_function();
    void add_query(std::string, std::string);
    void get_query(void);

};

&安培;这是class.cpp

void threads_queue::get_query(void){
    std::pair<char, std::string> value;
    //to do..
}


void threads_queue::add_query(std::string str, std::string work){
    //to do .. 

}

void run_function(){
   //Here I want to create two threads 
  //First thread like 
  boost::thread producer_thread(add_query);
  boost::thread consumer_thread(get_query);

  producer_thread.join();
  //done = true;
  consumer_thread.join()
}

我跟随这个例子: http://www.boost.org/doc/libs/1_54_0/doc/html/lockfree/examples.html

但问题是,当我想创建一个线程时,我总是会收到错误,但它不起作用

以下是我尝试解决错误:
1.

boost::thread consumer_thread(&threads_queue::get_query);

我收到了这个错误:

  

被叫对象类型&#39; void(threads_queue :: *)()&#39;不是功能或   函数指针

2

boost::thread consumer_thread(&threads_queue::get_query, this); 

我收到了这个错误:

  

无效使用&#39;这个&#39;在非静态成员函数之外

3

  boost::thread* thr = new boost::thread(boost::bind(&threads_queue::get_query));

我收到了这个错误:

  

/usr/local/include/boost/bind/bind.hpp:75:22:键入&#39; void   (threads_queue :: *)()&#39;不能在&#39; ::&#39;之前使用因为它没有   成员

我不是怎么解决这个问题,有什么帮助吗?

更新 本主题对该问题进行了很好的讨论: Using boost thread and a non-static class function

我的主要问题是我忘了添加

threads_queue:: 

在我的cpp文件中的run()之前,下面有Mikhail的评论,这是一个很好的帮助:。

1 个答案:

答案 0 :(得分:0)

您的代码存在很多问题。

  1. 非静态成员特定于某个类。除了函数之外,您还需要将类的实例传递给boost::thread的构造函数。这与线程或提升无关。

  2. threads_queue应该&#34;拥有&#34;线程,可能应该重命名为类似线程容器的东西。整个班级应该至少是不可复制的。

  3. 以下是somebody other than me.

    撰写的完整示例
    /  Copyright (C) 2009 Tim Blechmann
    //
    //  Distributed under the Boost Software License, Version 1.0. (See
    //  accompanying file LICENSE_1_0.txt or copy at
    //  http://www.boost.org/LICENSE_1_0.txt)
    
    //[spsc_queue_example
    #include <boost/thread/thread.hpp>
    #include <boost/lockfree/spsc_queue.hpp>
    #include <iostream>
    
    #include <boost/atomic.hpp>
    
    int producer_count = 0;
    boost::atomic_int consumer_count (0);
    
    boost::lockfree::spsc_queue<int, boost::lockfree::capacity<1024> > spsc_queue;
    
    const int iterations = 10000000;
    
    void producer(void)
    {
        for (int i = 0; i != iterations; ++i) {
            int value = ++producer_count;
            while (!spsc_queue.push(value))
                ;
        }
    }
    
    boost::atomic<bool> done (false);
    
    void consumer(void)
    {
        int value;
        while (!done) {
            while (spsc_queue.pop(value))
                ++consumer_count;
        }
    
        while (spsc_queue.pop(value))
            ++consumer_count;
    }
    
    int main(int argc, char* argv[])
    {
        using namespace std;
        cout << "boost::lockfree::queue is ";
        if (!spsc_queue.is_lock_free())
            cout << "not ";
        cout << "lockfree" << endl;
    
        boost::thread producer_thread(producer);
        boost::thread consumer_thread(consumer);
    
        producer_thread.join();
        done = true;
        consumer_thread.join();
    
        cout << "produced " << producer_count << " objects." << endl;
        cout << "consumed " << consumer_count << " objects." << endl;
    }
    //]