linux c++ 多线程编程

本文转载自http://www.cnblogs.com/xuxm2007/archive/2011/04/01/2002217.html

如何在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调用c++成员方法,在c++静态方法中,对对象进行转换即可实现,静态方法调用非静态方法。代码如下:
【test.h】
#ifndef TEST_H
#define TEST_H
 
class test
{
public:
    test();
    ~test();
private:
    int p;
    static void *threadFction(void *arg);
    void sayHello();
    void createThread();
};
 
#endif
 
[test.cpp]
test::test()
{}
test::~test()
{}
 
void *test::threadFunction(void *arg)
{
            test *f=static_cast<test *>(arg);
            f->sayHello();
            return NULL;
}
 
void sayHello()
{
    printf("Hello world %d!\n", p);
}
void test::createThread()
{
    pthread_t threadID;
 
    pthread_create(&threadID, NULL, threadFunction, this);
}
 
[main.cpp]
 
#inlcude "test.h"
 
int main()
{
    test t;
    t.createThead();
 
    for(;;);
 
    return 0;
}

转载于:https://www.cnblogs.com/dillyant/archive/2012/09/20/2696158.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一门linuxc++通讯架构实战课程,针对c/c++语言已经掌握的很熟并希望进一步深造以将来用c++linux下从事网络通讯领域/网络服务器的开发和架构工作。这门课程学习难度颇高但也有着极其优渥的薪水(最少30K月薪,最高可达60-80K月薪),这门课程,会先从nginx源码的分析和讲解开始,逐步开始书写属于自己的高性能服务器框架代码,完善个人代码库,这些,将会是您日后能取得高薪的重要筹码。本课程原计划带着大家逐行写代码,但因为代码实在过于复杂和精细,带着写代码可能会造成每节课至少要4~5小时的超长时间,所以老师会在课前先写好代码,主要的时间花费在逐行讲解这些代码上,这一点望同学们周知。如果你觉得非要老师领着写代码才行的话,老师会觉得你当前可能学习本门课程会比较吃力,请不要购买本课程,以免听不懂课程并给老师差评,差评也会非常影响老师课程的销售并造成其他同学的误解。 这门课程要求您具备下面的技能:(1)对c/c++语言掌握的非常熟练,语言本身已经不是继续学习的障碍,并不要求您一定熟悉网络或者linux;(2)对网络通讯架构领域有兴趣、勇于挑战这个高难度的开发领域并期望用大量的付出换取高薪;在这门课程中,实现了一个完整的项目,其中包括通讯框架和业务逻辑框架,浓缩总结起来包括如下几点:(1)项目本身是一个极完整的多线程高并发的服务器程序;(2)按照包头包体格式正确的接收客户端发送过来的数据包, 完美解决收包时的数据粘包问题;(3)根据收到的包的不同来执行不同的业务处理逻辑;(4)把业务处理产生的结果数据包正确返回给客户端;本项目用到的主要开发技术和特色包括:(1)epoll高并发通讯技术,用到的触发模式是epoll中的水平触发模式【LT】;(2)自己写了一套线程池来处理业务逻辑,调用适当的业务逻辑处理函数处理业务并返回给客户端处理结果;(3)线程之间的同步技术包括互斥量,信号量等等;(4)连接池中连接的延迟回收技术,这是整个项目中的精华技术,极大程度上消除诸多导致服务器程序工作不稳定的因素;(5)专门处理数据发送的一整套数据发送逻辑以及对应的发送线程;(6)其他次要技术,包括信号、日志打印、fork()子进程、守护进程等等;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值