pthread_create ::无法使用'void *'类型的右值初始化'void *(*)(void *)'类型的参数

时间:2014-04-07 16:01:21

标签: c++ macos pthreads

我试图将命名空间函数传递给pthread_create,但是编译器给了我错误,我已经googled,在stackoverflow中搜索,但我无法解决我的问题:

#include <pthread.h>                                                                                                                                                                                                                                                                                             
#include <iostream>
namespace SBProcThreads
{
  void ProcThread(void* defArg)
  {
    std::cout<<"### :"<<__PRETTY_FUNCTION__<<":   ThreadId  :"<<(pthread_self())->__sig<<": ###"<<std::endl;
  }
}


int main()
{
  pthread_t pThreadId;
  ::pthread_create(&pThreadId,NULL,(void*)&SBProcThreads::ProcThread,NULL);
}

我不想传递任何参数,我甚至删除了void * defArg并尝试在:: pthread_create函数中给出第4个参数,但它仍然给我错误。

2 个答案:

答案 0 :(得分:2)

pthread_create的函数签名需要一个返回void *的函数。另外,pthread_t返回的pthread_self()应该不透明地处理。这些变化都反映在下面并在我的机器上编译:

#include <pthread.h>                                                                                                                                                                                                                                                              
#include <iostream>
namespace SBProcThreads
{
    void * ProcThread(void* defArg)
    {
        std::cout<<"### :"<<__PRETTY_FUNCTION__<<":   ThreadId  :"<<(pthread_self())<<": ###"<<std::endl;
    }
}


int main()
{
      pthread_t pThreadId;
      ::pthread_create(&pThreadId,NULL,SBProcThreads::ProcThread,NULL);
}

更新:您的计划还存在其他一些问题。例如,在线程运行之前,main很可能会退出。如果你想确保它首先退出,你应该加入你的线程。使用原始pthreads是了解线程的一种很好的方法,但与一些预先存在的框架相比可能非常非常痛苦 - 如果你想刚刚启动并运行as,请尝试使用boost :: thread或std :: thread尽可能小麻烦。

答案 1 :(得分:0)

您只需要声明它以便它不需要演员:

  void *ProcThread(void* defArg)

  pthread_t pThreadId;
  ::pthread_create(&pThreadId,NULL,SBProcThreads::ProcThread,NULL);

或将其转换为所需的格式:

int main()
{
  pthread_t pThreadId;
  ::pthread_create(&pThreadId,NULL,(void*(*)(void*))&SBProcThreads::ProcThread,NULL);
}