使用pthread_create时出错

时间:2012-10-29 19:41:25

标签: c++

  

可能重复:
  pthread Function from a Class

我对c ++很新,我正在做一个关于TCP的项目。

我需要创建一个线程,所以我用Google搜索并找到了这个。 http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

我遵循其语法但遇到错误:  类型为'void *(ns3 :: TcpSocketBase ::)()'的参数与'void *()(void )'

不匹配

代码:

tcp-socket-base.h:
class TcpSocketBase : public TcpSocket
{
 public:
 ...
 void *threadfunction();
 ....
}




tcp-socket-base.cc:

void
*TcpSocketBase::threadfunction()
{
//do something
}



..//the thread was create and the function is called here
pthread_t t1;
int temp  =  pthread_create(&t1, NULL, ReceivedSpecialAck, NULL); //The error happens here
return;
...

任何帮助将不胜感激。谢谢!

编辑:

我接受了建议并使线程函数成为非成员函数。

namespaceXXX{

void *threadfunction()


int result  =  pthread_create(&t1, NULL, threadfunction, NULL);
      NS_LOG_LOGIC ("TcpSocketBase " << this << " Create Thread returned result: " << result );

void *threadfunction()
{
 .....
}


}

但我得到了这个错误:

初始化'int pthread_create的参数3(pthread_t *,const pthread_attr_t *,void *()(void ),void *)'[-fpermissive]

3 个答案:

答案 0 :(得分:2)

您希望将类的成员函数传递给pthread_create函数。线程函数应该是具有以下签名的非成员函数

void *thread_function( void *ptr );

答案 1 :(得分:2)

如果您想继续使用pthread,一个简单的例子是:

#include <cstdio>
#include <string>
#include <iostream>

#include <pthread.h>

void* print(void* data)
{
    std::cout << *((std::string*)data) << "\n";
    return NULL; // We could return data here if we wanted to
}

int main()
{
    std::string message = "Hello, pthreads!";
    pthread_t threadHandle;
    pthread_create(&threadHandle, NULL, &print, &message);
    // Wait for the thread to finish, then exit
    pthread_join(threadHandle, NULL);
    return 0;
}

如果你能够,更好的选择是使用新的C ++ 11 thread library。它是一个更简单的RAII接口,它使用模板,以便您可以将任何函数传递给线程,包括类成员函数(请参阅this thread)。

然后,上面的例子简化了这个:

#include <cstdio>
#include <string>
#include <iostream>

#include <thread>

void print(std::string message)
{
    std::cout << message << "\n";
}

int main()
{
    std::string message = "Hello, C++11 threads!";
    std::thread t(&print, message);
    t.join();
    return 0;
}

请注意,您可以直接传递数据 - 不需要与void*进行转换。

答案 2 :(得分:0)

如果声明函数static,它将编译。