在linux c++类中的成员函数里创建多线程要注意的地方

转载 2008年09月28日 11:32:00

如何在linux 下c++中类的成员函数中创建多线程

linux系统中线程程序库是POSIX pthread。POSIX pthread它是一个c的库,用C语言进行多线程编程我这里就不多说了,网上的例子很多。但是如何在C++的类中实现多线程编程呢?如果套用C语言中创建多线程的方式,在编译的时候会出现...does not match `void*(*)(void*)..这样的错误。出现这种情况的原因是,编译器在处理C++和C文件上是不同的,也就是说C++和C语言里边指针函数不等价。解决这种错误的方法

有两种:
1、不要将线程函数定义为类的成员函数,但是在类的成员函数里边调用它。
例如:
[test.h]
#ifndef TEST_H
#define TEST_H

class test
{
public:
    test();
    ~test();
private:
    void createThread();
};

#endif

[test.cpp]
test::test()
{}
test::~test()
{}

void *threadFunction()
{
    printf("This is a thread");

    for(;;);
}

void test::createThread()
{
    pthread_t threadID;

    pthread_create(&threadID, NULL, threadFunction, NULL);
}

[main.cpp]

#inlcude "test.h"

int main()
{
    test t;
    t.createThead();

    for(;;);

    return 0;
}

2、将线程函数作为类的成员函数,那么必须声明改线程函数为静态的函数,并且该线程函数所引用的其他成员函数也必须是静态的,如果要使用类的成员变量,则必须在创建线程的时候通过void *指针进行传递。
例如:
【test.h】
#ifndef TEST_H
#define TEST_H

class test
{
public:
    test();
    ~test();
private:
    int p;
    static void *threadFction(void *arg);
    static void sayHello(int r);
    void createThread();
};

#endif

[test.cpp]
test::test()
{}
test::~test()
{}

void *test::threadFunction(void *arg)
{
    int m = *(int *)arg;
    sayHello(m);

    for(;;);
}

void sayHello(int r)
{
    printf("Hello world %d!/n", r);
}
void test::createThread()
{
    pthread_t threadID;

    pthread_create(&threadID, NULL, threadFunction, NULL);
}

[main.cpp]

#inlcude "test.h"

int main()
{
    test t;
    t.createThead();

    for(;;);

    return 0;
}

C++ 11 线程调用类的成员函数解决办法

在C++中,_beginthreadex 创建线程是很麻烦的。要求入口函数必须是类的静态函数。 通常,可以采用thunk,或者模板来实现。 因C++ 11中引入了 std::async ,可以很好...
  • badboy518
  • badboy518
  • 2017年01月31日 17:15
  • 1146

在类中使用类成员函数创建线程

demo书写大概步骤:      1》创建一个类,在类中创建一个函数      2》在构造函数中创建线程,使用类中的成员函数 类中代码:  类头: #pragma once #include cla...
  • qq_21000273
  • qq_21000273
  • 2016年04月10日 15:54
  • 1003

在类中使用_beginthreadex函数创建线程并访问该类中的数据成员

#include #include #include using boost::asio::ip::tcp; #include "boost/date_time/posix_time/pos...
  • u012519333
  • u012519333
  • 2013年11月25日 16:34
  • 1049

C++中类的成员函数作为 pthread_create的线程函数

在C++的类中,普通成员函数作为pthread_create的线程函数就会出现参数问题,因为其不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是...
  • hsd2012
  • hsd2012
  • 2016年04月21日 11:42
  • 2849

类模板、函数模板以及类成员函数在类外定义情况

1函数模板的写法 函数模板的一般形式如下: Template 返回类型 函数名(形参表) {//函数定义体 } 说明: template是一个声明模板的关键字,表示声明一个...
  • wonengguwozai
  • wonengguwozai
  • 2016年08月03日 21:09
  • 3158

c++类成员函数

c++的两大特色是多态和模板。其中多态是通过继承和虚函数来实现的,其中虚函数是通过每个对象里面的虚表来实现的。如果这个对象的类有虚函数,那么这个类就有一张虚表,存的是每个虚函数的入口地址,而这个类的每...
  • yuanyirui
  • yuanyirui
  • 2009年09月25日 17:04
  • 9575

如何利用c++11的新特性编写类成员线程函数并实现同步

之前在科大讯飞的面试中,面试官问了一个问题:如何编写一个线程函数,如何编写一个类中的成员函数(线程函数) 。前面一个问题固然简单,但是后面一个当时就把我问懵逼了从来没有试过在类内部写一个线程函数。回头...
  • u011418173
  • u011418173
  • 2017年08月27日 22:52
  • 189

linux c++类中的成员函数里创建多线程要注意的地方

如何在linux 下c++中类的成员函数中创建多线程 linux系统中线程程序库是POSIX pthread。POSIX pthread它是一个c的库,用C语言进行多线程编程我这里就不多说了,网...
  • chenguang209
  • chenguang209
  • 2013年11月19日 20:33
  • 744

boost线程之类成员函数

首先,是准备工作,包含头文件 #include #include #include #include using namespace std; //线程休眠,毫秒级 #define B...
  • zhuxian2009
  • zhuxian2009
  • 2015年09月02日 17:39
  • 965

c++ 类成员函数内删除this指针

问题1:成员函数内能不能delete this。 但从编译
  • fridayzhu
  • fridayzhu
  • 2014年06月20日 00:07
  • 1196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在linux c++类中的成员函数里创建多线程要注意的地方
举报原因:
原因补充:

(最多只允许输入30个字)