c ++ pthread错误:无效使用非静态成员函数

时间:2017-03-17 18:40:09

标签: c++ pthreads

我有错误:当我尝试编译以下代码时无效使用非静态成员函数:

rows, err := db.Query(q)
if err != nil {
    fmt.Println(err)
}

defer rows.Close()

for rows.Next() {
    var data string // same database type
    if err := rows.Scan(&data); err != nil {
        log.Fatal(err)
    }
    fmt.Println(data)
}

收到错误:

int main()
{
    data d;
    cta ce;
    pthread_t thread1;
    pthread_t thread2;
    pthread_create( &thread1, NULL, d.subscribe, NULL ); 
    pthread_create( &thread2, NULL, ce.startStrategy, NULL ); 
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);

    return 0;
}

// cta.cpp
// ...
static void* cta::startStrategy()
{
    std::cout<<"haha"<<std::endl;
}

// data.cpp
// ...
static void* data::subscribe()
{ 
  std::cout<<"haha"<<std::endl;
}

但是,类似的代码段工作得很好:

main.cpp:38:52: error: invalid use of non-static member function
pthread_create( &thread1, NULL, d.subscribe, NULL ); 
                                                ^
main.cpp:39:60: error: invalid use of non-static member function
pthread_create( &thread2, NULL, ce.startStrategy, NULL ); 

它编译得很好并打印“hi”两次,我想知道我的代码可能有什么问题,因为我已经从void更改为static void并遵循相同的模式,为什么我仍然会得到非静态错误?

2 个答案:

答案 0 :(得分:1)

首先,不要使用pthread。使用C ++ std::thread,实现快乐。

见证这个:

std::thread t1(&data::subscribe, &d);
std::thread t2(&cta::start_strategy, &ce);

其次,问题的最可能原因是static修饰符应该用在类定义(.h文件)中,而不是在类外的函数定义中。

答案 1 :(得分:-1)

如果你要使用pthread_create,你必须传递它想要的参数。启动例程为void *(*start_routine) (void *)。请注意,那里的任何成员函数都没有,static或其他。所以代码是不正确的,即使它恰好在某个平台上运行。