Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost::函数绑定的成员函数变得无效_C++_Boost Thread_Boost Bind_Boost Function - Fatal编程技术网

C++ Boost::函数绑定的成员函数变得无效

C++ Boost::函数绑定的成员函数变得无效,c++,boost-thread,boost-bind,boost-function,C++,Boost Thread,Boost Bind,Boost Function,我有一个简单的线程池实现,使用boost::function和boost::bind将成员函数签名减少到void func(void)。然后使用一个由boost::function和int对组成的队列,弹出队列的顶部,并执行该函数(所有函数都包装在互斥块中) 你瞧,经过几次迭代后,断言跳闸,这表明我的boost::function不可调用 我首先想到的可能是函数数据(来自Foo类)在调用函数之前就已经被销毁了,但是据我所知,boost::function创建了一个数据副本以形成闭包。不幸的是,我

我有一个简单的线程池实现,使用
boost::function
boost::bind
将成员函数签名减少到
void func(void)
。然后使用一个由
boost::function
int
对组成的队列,弹出队列的顶部,并执行该函数(所有函数都包装在互斥块中)


你瞧,经过几次迭代后,断言跳闸,这表明我的
boost::function
不可调用

我首先想到的可能是函数数据(来自
Foo
类)在调用函数之前就已经被销毁了,但是据我所知,
boost::function
创建了一个数据副本以形成闭包。不幸的是,我不知道是什么原因导致
boost::function
s无效,无法进一步解决这个问题。我是否错误地绑定了成员函数,或者问题是否介于这和尝试调用它之间


编辑:我应该提到:
Foo
是在堆上分配的,并且在线程加入之前不会
delete
d。

std::queue不是线程安全的。当你说你正在使用互斥来从队列中弹出时,我知道你也在做同样的事情来推队列

此外,你还需要照顾Foo的一生。考虑将SypDypTR传递给异步函数。(从_this()而不是此共享_)

注意:您可以使用boost::asio来实现任务调度。 这里有一篇关于这方面的很好的文章
std::queue不是线程安全的。当你说你正在使用互斥来从队列中弹出时,我知道你也在做同样的事情来推队列

此外,你还需要照顾Foo的一生。考虑将SypDypTR传递给异步函数。(从_this()而不是此共享_)

注意:您可以使用boost::asio来实现任务调度。 这里有一篇关于这方面的很好的文章

boost::function
将创建您传递给它的
指针的副本,即它保留一个具有相同地址的指针。它没有
*的副本,此
boost::function
将创建您传递给它的
指针的副本,即它保留一个具有相同地址的指针。它没有
*this
的副本。事实上,每次在互斥体中访问队列时,我都在包装它。Foo是在堆上分配的,在线程连接之前不会调用析构函数。另外,我做这篇文章是为了尝试和理解如何使用boost::function和boost::bind,但我肯定会研究boost::asio,谢谢!事实上,每次在互斥对象中访问队列时,我都会进行包装。Foo是在堆上分配的,在线程连接之前不会调用析构函数。另外,我做这篇文章是为了尝试和理解如何使用boost::function和boost::bind,但我肯定会研究boost::asio,谢谢!
threadPool->addJob(boost::bind(&Foo::bar, this, arg1, arg2));

...

typedef boost::function<void(void)> func;
std::queue<std::pair<func, int> > funcQ;

void ThreadPool::addJob(func f){
    funcQ.push(std::make_pair(f, j));
}

if (!funcQ.empty()){
    func localFunc = (funcQ.front()).first;
    ...
    funcQ.pop();
    ...
    localFunc();
}
...
assert(funcQ.front().first);
func localFunc = (funcQ.front()).first;
...