【问题标题】:pthread_create :: cannot initialize a parameter of type 'void *(*)(void *)' with an rvalue of type 'void *'pthread_create :: 无法使用“void *”类型的右值初始化“void *(*)(void *)”类型的参数
【发布时间】:2014-04-07 16:01:20
【问题描述】:

我正在尝试将命名空间函数传递给 pthread_create,但编译器给了我错误,我用谷歌搜索,在 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 函数中提供第四个参数,但它仍然给我错误。

【问题讨论】:

    标签: c++ macos pthreads


    【解决方案1】:

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

    #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 很可能会在您的线程运行之前退出。如果你想确保它首先退出,你应该加入你的线程。使用原始 pthread 是了解线程的好方法,但与现有的一些框架相比可能会非常痛苦 - 如果您只想启动并运行 as,请尝试 boost::thread 或 std::thread尽可能少的麻烦。

    【讨论】:

    • 谢谢@Andy,我会尝试在我的机器上编译并更新。代码只是我的应用程序的一部分。我的 main() 中有一个 while 循环,它独立地做一些事情。我知道使用框架会很容易,但我想了解更多关于 pThreads 的信息,所以我不介意这很痛苦。
    【解决方案2】:

    您只需要声明它就不需要强制转换:

      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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多