创建线程时的常见错误

创建线程时的常见错误,第1张

创建线程时的常见错误

1.linux下 pthread_create创建多线程编译报错

error: invalid conversion from ‘void (*)()’ to ‘void* (*)(void*)’ [-fpermissive]
     pthread_create(&id,NULL,Test,NULL);

比如你自定义了一个线程函数

 void Test()
{

}

随后将这个函数作为传参调用pthread_create进行线程创建

    pthread_t id ;
    pthread_create(&id,NULL,Test,NULL);

就会出现上述报错,为什么会出现这种报错呢?首先看pthread_create的函数签名

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

参数1:pthread_t类,是一个线程标识符
参数2:线程属性,一般被设置为NULL
参数3:线程函数
怎么理解void *(start_routine) (void )
定义了一个函数指针 start_routine,他的返回值是void
输入参数是void

参数4:线程函数对应的实际输入参数

2.利用C++11得std::thread创建线程

int Test1(int a ,int b)
{
    while(true)
    {
        std::cout<<"Test1"< 

问题在于
写法1: std::thread NewTask(Test1,a,b);
这一行代码不管是如上得定义,还是改为
写法2: std::thread NewTask(&Test1,a,b);
都可以编译通过,而且都可以正常运行,就…有点奇怪,额。。难道是构造函数重载了?…
真是搞不懂…

3.类的实例方法可以创建线程么?
思考一个问题,类的实例方法与类的静态方法不一样,类的静态方法在编译起就已经确定了(在类的域名空间作用下),而类的实例方法需要在实例化类的时候才会确定。C++编译器在编译时会将类的实例对象地址作为第一个传参传给该方法,比如一个叫threadFunc的类实例方法,在编译后,他的函数签名会变成 threadFunc(Thread * this,void * agr);

Class Thread
{
	//...省略其他
	threadFunc(void * arg){}
}

所以在创建新的线程时,如果这样写就会报错

std::thread *NewTask = new std::thread(&Thread::threadFunc);
/usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of()>’
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^
/usr/include/c++/4.8/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of()>’
         _M_invoke(_Index_tuple<_Indices...>)

正确的初始化线程的方式是

Thread A;
std::thread *NewTask = new std::thread(&Thread::threadFunc,&A);
//或者如果这个函数是在Class体内,可以直接用this指针表示

欢迎分享,转载请注明来源:内存溢出

原文地址:https://outofmemory.cn/zaji/5593876.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

随机推荐

  • 全包装修也叫什么装修

    导读:房屋交易买卖完成后,业主一般就开始计划装修事宜,如果担心怕麻烦的情况下可能会选择找装修公司并全包,那么全包装修也叫什么装修?全包装修也叫包工包料装修,也就是说所有材料采购和施工都由施工方负责,对于业主来说这是最省心的一种装修方式,同时

    2022-12-29
    1800
  • 女孩青春期早恋如何引导 女孩青春期早恋怎样引导教育

    导读:女孩青春期早恋如何引导?以下由小编为大家带来介绍。1、不要施压于孩子。发现孩子早恋,立马进行责备式说教,甚至打骂孩子,警告绝对不允许再和男孩或女孩子联系,串通老师与对1、不要施压于孩子。发现孩子早恋,立马进行责备式说教,甚至打骂孩子,

    2022-12-29
    1900
  • 房屋贷款利率还会下调吗

    导读:在申请房贷的时候要考虑房屋贷款利率相关的因素,因为房贷利率与房屋贷款利息息息相关,那一般房屋贷款利率还会下调吗?下面来看看吧。用户申请房贷,默认执行LPR浮动利率,因此只要LPR下调,用户的房贷利率就有下调的机会。当然,实际能否下调,

    2022-12-29
    1900
  • 三江指的是哪三江

    三江源地区位于我国的西部,世界屋脊──青藏高原的腹地、青海省南部,平均海拔3500~4800米,为孕育中华民族、中南半岛悠久文明历史的世界著名江河:长江、黄河和澜沧江的源头汇水区,那么三江指的是哪三江?三江指的是哪三江1、三江平原的“三江”

  • 龙生活在哪里(天上的龙和海里的龙)

    提到龙宫,大家首先想到的肯定是海底,比如中国神话中经常出现的东海龙宫。龙宫只存在于海底吗?当然不是。中国神话中龙的种类很多,有海龙、河龙、湖龙、潭龙、山龙。只有最顶端的海龙王生活在海底。龙其实大多生活在山川江湖,有修仙者管理一个地区,如《西

    2022-12-29
    4600
  • 2026年冬奥会什么时候在哪里举行

    新华社意大利科尔蒂纳丹佩佐2月21日电(记者刘咏秋、周啸天、陈占杰)在2月20日举行的北京冬奥会闭幕式上,意大利呈现了精彩的“八分钟”表演,意大利米兰市市长萨拉和科尔蒂纳丹佩佐市市长盖迪纳从国际奥委会主席巴赫手中接过奥林匹克会旗,标志着20

    2022-12-29
    1500
  • 口碑最好的补水面膜排行榜_面膜补水保湿哪个牌子的好

    说起补水保养皮肤,面膜是必不可少的护肤臻品。越来越多人在挑选适合自己的面膜时都犯了难,小编今天给大家总结出10款超口碑嫩肤保湿面膜,上榜的品牌依次为:悦蕾、植村秀、碧欧泉、自然机理、OLAY、法国希思黎、彼得罗夫、伊丽莎白雅顿、科颜氏、梦妆

    2022-12-29
    1500
  • 秋天冰箱冷藏室结冰是什么原因

    冰箱是生活中比较常见的一种家用电器,它可以起到很好的保鲜作用,可以保存各种各样的食物。在秋天的时候,有些人会发现冰箱冷藏室里面结冰了,这个主要是使用不当引起的,比如冰箱没有关好,热的食物直接放冰箱保存了,或者食物的含水量比较大等。秋天冰箱冷

    2022-12-29
    2200
  • 周柱俊的身份是什么

    周柱俊的身份是西南大三线建设工人,是电视剧《人世间》中的角色。《人世间》是由李路执导并担任总制片人,雷佳音、辛柏青、宋佳、殷桃领衔主演,丁勇岱、成泰燊、萨日娜、宋春丽、隋俊波、黄小蕾、于震、王阳、白志迪、胡连馨、吴幸键等主演,张凯丽、冯雷特

发表评论

登录后才能评论

评论列表(0条)

    保存