linux下 c++多线程的实现

时间:2022-04-17 18:36:00

由于pthread是c库,直接g++编译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; }