c++ 调用pthread_create函数时,传入类中的成员报错。解决方法。

1.问题出现

我想把我的c程序转成c++的方式写,因为我觉得c++的面向对象方式特别的好用。

然后我开始移植了,当我想把在一个类函数中调用pthread_create来创建一个类。

我给的参数是

s=pthread_create(&id,NULL,run,NULL);

//函数原型

void * THREAD_433::run(void *arg)
{
    void * ret;
    using namespace  std;
    cout<<"hello!\r\n";
    return ret;
}

这个时候就会编译出错,

D:\Cprogress\pthread\my_thread.cpp:15: error: cannot convert ‘THREAD_433::run‘ from type ‘void* (THREAD_433::)(void*)‘ to type ‘void* (*)(void*)‘
     s=pthread_create(&id,NULL,run,NULL);
                                       ^

他说这个类型不匹配。

2.问题解决

出现类型不匹配的问题。因为pthread_create需要的参数类型为void* (*)(void*),而run作为类的成 员函数时其类型是void* (Thread_433::)(void*)的成员函数指针。

我们知道类的成员函数在经过编译器处理之后,会变成带有 this指针参数的全局函数,所以类型注定是不会匹配的。

但是如果将run声明为static类型,那么编译器会将static形式的函数,转换成不带this指针的全局函数,所以其类型可以与pthread_create需要的参数类型相匹配。但是类的静态成员函数无法访问类的非静态成员,不过这可以通过传递this指针解决这个问题。

修改过的代码:其他都不需要变

void THREAD_433::Init(void)
{

    int s;
    s=pthread_create(&id,NULL,THREAD_433::run,NULL);
    if(s!=0)
            std::cout<<"err!\r\n";
}

/**********类声明***********/
class THREAD_433
{
public:
    THREAD_433 ();
    void Init(void);
    void Delete(void);

private:
    pthread_t id;
    static void *run(void *arg);
};

原文地址:https://www.cnblogs.com/ZQQH/p/8930193.html

时间: 2024-08-12 12:44:55

c++ 调用pthread_create函数时,传入类中的成员报错。解决方法。的相关文章

windows平台在tomcat中启动cas报错解决

windows平台在tomcat中启动cas报错: Caused by: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no jansi in java.library.path, 系统找不到指定的路径.] 解决办法:将jansi.dll文件放到C:\Windows\System32目录下即可. 注意:jansi.dll文件在使用gradle编译打包cas时会下载到C:\Users\${用户名}\.gradle

类库文件引用web服务报错解决方法-在 ServiceModel 客户端配置部分中,找不到引用协定的默认终结点元素

由于需求,需要改造原有应用,因原有应用是写在console下面的,现在需要开放至web下, 想到BIZ层应用代码都是一样的,又不想在web下在添加引用,而重复写代码,故将原有的console下的服务和web下服务一起迁移至BIZ层 于是我将console下的引用,web下的引用,全部添加至BIZ层进行引用 但在调试,运行的时候,问题出现了, 在 ServiceModel 客户端配置部分中,找不到引用协定“PutMCCases.PutMCCasesSoap”的默认终结点元素.这可能是因为未找到应用

C# .NET4.0 改为 到.NET2.0 时 TypedTableBase 报错解决方法

.NET 4.0 降版本 到.NET 2.0.不出意外,问题必然来了. 编译错误一: 错误 1 命名空间“System”中不存在类型或命名空间名称“Linq”(是缺少程序集引用吗?)解决: 删掉该引用--没用到情况下,呵呵 使用Linq时,引用一个LinqBridge.dll 就可以了 编译错误二: 错误 2 命名空间“System.Data”中不存在类型或命名空间名称“TypedTableBase”(是缺少程序集引用吗?) 解决: 该错误出现在代码生成工具生成Dataset的片段里面. .NE

C#中对指针操作报错解决方法

(C#中实际不存在指针,这里是仿C语言中指针操作进行说明) 1.错误1      “指针和固定大小缓冲区只能在不安全的上下文中使用” 解决方法:在方法前加上unsafe关键字 2.错误2 “不安全代码只会在使用 /unsafe 编译的情况下出现” 解决方法:右键选中资源管理器中项目文件--属性--生成--勾选"允许不安全代码复选框"! 事例代码,取变量a的内存地址并输出: using System; using System.Collections.Generic; using Sys

hive中创建子表并插入数据过程初始化MR报错解决方法

本文继成上一篇通过hive分析nginx日志文章,详情参考下面链接: http://www.cnblogs.com/wcwen1990/p/7066230.html 接着来: 创建业务子表: drop table if exists chavin.nginx_access_log_comm; create table if not exists chavin.nginx_access_log_comm( host STRING, time STRING, request STRING, refe

java中的@Override报错解决

问题: 有时候在java的Eclipse工程中会遇到@Override报错,把@Override去掉就好了,可是有时候@Overvide太多,不能从根本上解决问题. 分析: 这是jdk版本之间区别的问题: 在Jdk1.5中@Override就已经有了,但是对接口的实现是不支持的,所以报错. 在Jdk1.6以后无论是对父类的继承还是对接口的实现都支持了 解决:首先确保机器上已经安装了Jdk1.6的版本 然后,选择eclipse菜单Windows->Preferences-->java->C

动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法 (转)

本文转自:http://blog.csdn.net/limlimlim/article/details/8647038 [导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS2010里时,发现引用出现错误标志.代码如下: '// 3. 创建客户端代理代理类. ServiceDescriptionImporter importer = new ServiceD

调用js函数时,参数带单、双引号怎么解决?

单引号    ' ----------> ' 例子: 这是一个 html 节点属性值中使用到  ' 仍然是用来表示 ' 实体 onchange="javascript:setTimeout('abc(\'a\',\'\')', 0)" 等价于 onchange="javascript:setTimeout('abc(\'a\',\'\')', 0)" 除html/xml中表示单引号外, 在某些情况为了防止数据库注入等安全问题. 双引号    " --

.net winform 调用类中的webbrowser 报错:当前线程不在单线程单元中,因此无法实例化 ActiveX

遇到这个恶心的问题纠缠得不要不要的,大家遇到了的话希望不要走弯路,经过这个折腾让我有点怀疑人生了.哈哈哈 解决代码如下: //创建新线程专门用于跑子窗 Thread thd = new Thread(new ParameterizedThreadStart(ShowNotify)); thd.SetApartmentState(ApartmentState.STA);//关键设置 thd.IsBackground = true; thd.Start(); Thread.CurrentThread