首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在allocate_stack中(stack=<synthetic pointer>,pdp=<synthetic pointer>

在allocate_stack中(stack=<synthetic pointer>,pdp=<synthetic pointer>
EN

Stack Overflow用户
提问于 2016-02-17 00:51:31
回答 1查看 539关注 0票数 0

在执行以下示例程序时,我遇到了一个分段错误:

代码语言:javascript
复制
#include<iostream>
#include<pthread.h>
#include<string.h>
#include<exception>
#include<stdexcept>
using namespace std;

class ThreadHandler
{
  public:
    int createThread(void (*function)(void*),void* input);
    void setThreadID(int);
    int getThreadID();
    void runThread();
    /* Constructor for ThreadHandler*/
    ThreadHandler();
    virtual ~ThreadHandler();
  protected:
  private:
    int mThreadID;
    pthread_t thread;
};

/* Function: ThreadHandler() */
ThreadHandler::ThreadHandler():mThreadID(0)
{
   cout<<"\n ThreadHandling - constructor"; 
}

/* Function: ~ThreadHandler() */
ThreadHandler::~ThreadHandler()
{
}

/*Function: setThreadID() - set mThreadID value after
  thread creation*/
void ThreadHandler::setThreadID(int thread_id)
{
  cout<<"\n setThreadID function Entry";
  mThreadID=thread_id;
  cout<<"\n Thread ID: "<<mThreadID;
  cout<<"\n setThreadID function Exit";
}

/*Function: getThreadID() - return a thread ID after
  thread creation*/
int ThreadHandler::getThreadID()
{
  return mThreadID;
}

/*Function: createThread() - Create Thread
  and Assign function dynamically */
int ThreadHandler::createThread(void (*callingFunction)(void*),void* input)
{
  cout<<"\n createThread Function Entry";
  int thread_id=pthread_create(&thread,(pthread_attr_t*)callingFunction,NULL,input);
  if(thread_id)
  {
     cout<<"\n Failed to create the thread and throw an exception";
     throw;
  }
  setThreadID(thread_id);
  cout<<"\n createThread Function Exit";
  return thread_id;
}

/* Function: runThread() -- Joinable thread for exection*/
void ThreadHandler::runThread()
{
  cout<<"\n Join the thread for runnable"<<endl;
  pthread_join(this->thread,NULL);
}

/*Function to execute by the thread*/
void ThreadFunction(void* input)
{
   cout<<"\n Thread Execution: "<<input;
}
/*Main part of the Class and Execution*/
int main()
{
   char* msgPtr="I am running";
   ThreadHandler *objThread = new ThreadHandler();
   if(objThread==NULL)
   {
      cout<<"\n Failed to create a ThreadHandler object";
      return -1;
   } 
   /*Create a function pointer to pass*/
   //void* (*FunctionPtr)(void*)=NULL;
   //FunctionPtr = &ThreadFunction;
   try
   {
      cout<<"\n -- start create a thread --";
      objThread->createThread(&ThreadFunction,reinterpret_cast<void*>(msgPtr));
   }
   catch(exception& e)
   {
      cout<<"\n Exception while creating the thread";
   }
   return 0;
}

错误: ThreadHandling -构造函数--开始创建线程--

程序接收信号SIGSEGV,分段故障。0x00007ffff76aab8c,位于stack= 415 allocatestack.c的allocate_stack (stack=,pdp=,attr=0x400ead )。c:没有这样的文件或目录。

EN

回答 1

Stack Overflow用户

发布于 2016-02-17 01:12:41

Problem

看起来您正在以错误的顺序向pthread_create传递参数。

来自man-pages

代码语言:javascript
复制
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

解决方案

更改此设置:

代码语言:javascript
复制
pthread_create(&thread,(pthread_attr_t*)callingFunction,NULL,input);

要这样做:

代码语言:javascript
复制
pthread_create(&thread, NULL, callingFunction, input);

建议

我建议使用std::thread,因为它使处理线程变得更加容易,特别是在与std::function结合使用时。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35438347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档