免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9907 | 回复: 9
打印 上一主题 下一主题

[C++] 如何把类成员函数地址提供给boost::thread? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-10 10:11 |只看该作者 |倒序浏览
如果不构建类,用一个函数创建新线程没有问题,但是放到了类里面,就不行了
class Robot
{
private:
boost::thread *readThread;

public:
Robot();
~Robot();
void Read();
}

Robot::Robot()
{
readThread = new boost::thread(&Robot::Read); //这就不行了
}
Robot::Read()
{return;}

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2011-06-10 12:52 |只看该作者
把你的成员函数改成static属性。

论坛徽章:
1
双子座
日期:2014-08-29 17:15:03
3 [报告]
发表于 2011-06-10 17:17 |只看该作者
不是有个function可以绑定成员函数的么?

论坛徽章:
0
4 [报告]
发表于 2011-06-10 17:32 |只看该作者
boost下最常用的就是bind了

bind(&Robot::Read,this);

论坛徽章:
0
5 [报告]
发表于 2011-06-10 18:10 |只看该作者
4楼,正解, 用BOOST在了解下BIND和FUNCTOR吧

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
6 [报告]
发表于 2011-06-11 02:10 |只看该作者
boost下最常用的就是bind了

bind(&Robot::Read,this);
int-main 发表于 2011-06-10 17:32



    何时 C++ 能有这个,“委托(delegate)是一种引用类型,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。”{:3_189:}

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
7 [报告]
发表于 2011-06-11 10:03 |只看该作者
哈哈,不懂boost.

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
8 [报告]
发表于 2011-06-11 14:51 |只看该作者
本帖最后由 w_anthony 于 2011-06-11 15:02 编辑
boost下最常用的就是bind了

bind(&Robot::Read,this);
int-main 发表于 2011-06-10 17:32



虽然不太了解boost,不过boost的函数绑定都是“形式上”的函数,而不是“实质上”的函数,bind函数实际上是返回一个对象,而不是一个函数指针。并且它也无法转换成函数指针,就像你无法把bind的结果传递给pthread_create来创建线程一样,这样是无法通过编译的。
不过貌似boost::thread的参数不是函数指针,用bind通过编译应该没有问题,但如果是boost::thread(bind(func, param))这样的写法,那么假设在func函数内部的头部加一句sleep(3)然后再访问param变量,那么是否会出现bind所返回的对象先析构然后才是func内部sleep完毕后对param访问。如果有这种情况存在的话,访问一段已经释放的内存,实际上是未定义行为,应该要避免。不过这些都是我个人猜测,等其它了解boost的人证实真缪吧……

论坛徽章:
0
9 [报告]
发表于 2011-06-11 17:03 |只看该作者
boost下最常用的就是bind了

bind(&Robot::Read,this);
int-main 发表于 2011-06-10 17:32


用上了,学艺不精,见笑,见笑
PS:另外有人能推荐一些关于函数对象和STL的书么?感觉boost里面的模板和各种对象都超级抽象

论坛徽章:
0
10 [报告]
发表于 2011-06-12 10:40 |只看该作者
其实 gcc 有一个直接把成员函数指针解包为普通函数指针的语法扩展。不过我是从来没用过……
http://gcc.gnu.org/onlinedocs/gc ... mber-functions.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP