这是我的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的评论,这是一个很好的帮助:。
答案 0 :(得分:0)
您的代码存在很多问题。
非静态成员特定于某个类。除了函数之外,您还需要将类的实例传递给boost::thread
的构造函数。这与线程或提升无关。
threads_queue
应该&#34;拥有&#34;线程,可能应该重命名为类似线程容器的东西。整个班级应该至少是不可复制的。
/ 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;
}
//]