在C ++中创建线程时出错

时间:2014-02-12 11:17:20

标签: c++ multithreading

我正在做一个发送短信程序,但是当我在线程中创建与服务器的连接时,我得到了一个错误。

g++ -L/usr/lib/i386-linux-gnu -o main Socket.cpp ServerSocket.cpp modemSMS_w.cpp main.cpp Config.cpp -lpthread -lserial -lxml2 -lmysqlclient
modemSMS_w.cpp: In member function ‘void modem::enviasms()’:
modemSMS_w.cpp:96:77: error: cannot convert ‘void* (modem::*)(void*)’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’

该计划:

#include "modemSMS_w.hpp"
#define CTRL_C "\x1A"

using namespace LibSerial;
using namespace std;

modem::modem()
{
}

void *modem::func_servidor(void *ptr)
{

ServerSocket server(30001);

        try {
                ServerSocket new_sock;
                while(1)
                {
                        server.accept(new_sock);
                        cout << "Conexao aceita" << endl;
                }
        }
        catch (SocketException& e) {
                cout << "Erro: Criando Servidor" << endl;
        }

}

int modem::setSerial() {
.....
....
...
}

void modem::enviasms(){

  pthread_t thread_servidor;
  pthread_cond_t cv;

  const int PORT_MON = 30000;
  string serialPort = "/dev/ttyS0";

  int argc;
  int ret;
  char **argv;

    cout << "\n------------------------\n  MODEM GPRS \n------------------------" << endl;
    string mensagem ="Conversao";
    mensagem.c_str();

    ret = pthread_cond_init(&cv, NULL);
    bool envia = true;
    envia = true;
    if (ret != 0)
    {
            cout << "Erro na criação do evento. Por favor reeinicie o programa." << endl;
    }

    //ERROR IN THIS LINE
    pthread_create(&thread_servidor, NULL,&modem::func_servidor, (void* ) true );

    Config config;
    SerialStream ssStream;
    setSerial();

....
...
}

很抱歉,我几乎不知道在C ++中创建线程几乎没有。已经尝试解决这个问题,但没有成功。

2 个答案:

答案 0 :(得分:1)

您永远不会创建Modem类的实例,那么如何调用该类的成员函数?

会员功能需要会员才能进行操作。不要将指向成员函数的指针传递给pthread_create。创建一个非成员函数,该函数调用成员函数并将指针传递给pthread_create

答案 1 :(得分:1)

您可以向类添加静态函数并在pthread_create函数中使用它:

class modem {
    public:
        //...
        static void* thread_func(void* arg);
        //...
};

void* modem::thread_func(void* arg) {
    return reinterpret_cast<modem*>(arg)->func_servidor();
}

void *modem::func_servidor() {
    // some code
}

void modem::enviasms(){
    //some code scipped
    if(pthread_create(&thread_servidor, NULL, &modem::thread_func, reinterpret_cast<void*>(this)) != 0) {
        //some error handling code
    }
    //...
    if(pthread_join(thread_servidor, NULL) != 0) {
    // handle error
    }
}

但是,恕我直言,使用boost或std线程要好得多。使用这种方法不需要静态函数:

auto thr = std::thread{ &modem::func_servidor, this };
//...
thr.join();

但请注意,在线程存在时,必须检查this指向的对象。