我试图将命名空间函数传递给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个参数,但它仍然给我错误。
答案 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);
}