如何在同一个函数上编写pthread_create?

时间:2010-02-13 04:17:16

标签: c++ c multithreading

有人可以帮忙吗?我有以下内容:

// part_1
if (pthread_create(&threadID, NULL, ThreadMain, 
    (void *) clientSocket) != 0) {
    cerr << "Unable to create thread" << endl;
    exit(1);
}

// part_2
void *ThreadMain(void *clientSocket) {

  pthread_detach(pthread_self()); 

  ...

  delete (TCPSocket *) clientSocket;
  return NULL;
}

我想在part_1中有part_2(我的意思是不调用TreadMain()函数)

感谢您的回复

3 个答案:

答案 0 :(得分:5)

如果您可以这样做怎么办?

pthread_create()必须为要使用的新线程创建一个新堆栈。如果pthread_create()将现有线程的旧堆栈复制到单独的内存块中以创建新堆栈,那么指向其他局部变量的局部变量会发生什么?新堆栈上的局部变量将指向旧堆栈。当使用旧堆栈(调用pthread_create()的线程)的线程返回或覆盖它们时,这些变量开始指向无效数据。

但是fork()呢?为什么fork()不使用像pthread_create()这样的函数指针?好吧,与pthread_create()不同,由fork()创建的新执行线程不必与旧的执行线程位于相同的地址空间中,因为它们位于不同的进程中。 fork()克隆父进程的虚拟地址空间,堆栈,堆和所有。子进程的堆栈变量与父进程中的对应变量具有相同的虚拟地址。因此,无论旧的父进程对内存执行什么操作,新子进程中的所有指针都将继续有效*。

* Nitpicker的角落:排除开头无效的指针,以及故意共享的内存

答案 1 :(得分:2)

如果您只想在part1中移动part2的函数,则可以在part1中创建一个本地类,并使用 static 成员函数...

class LocalFunctor
{
public:
   static void *ThreadFunc(void* clientSocket)
   {
      pthread_detach(pthread_self());
      ...
      delete (TCPSocket *) clientSocket;       
      return NULL;  
    }
};

然后在pthread_create

中调用LocalFunctor :: THreadFunc
pthread_create(&threadID, NULL, LocalFunctor::THreadFunc,(void *) clientSocket)

如果您要多次执行此操作,请查看boost :: thread或将其包装在模板助手类中。

-Rick

答案 2 :(得分:-1)

您可以使用OS 10.6获得Apple Macintosh计算机并开始使用Grand Central Dispatch进行编程。 Apple添加了一些新的C编译器功能,几乎完全符合您的要求。他们被称为块。