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

问题描述 投票:2回答:3

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

// 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()函数)

感谢您的答复

c++ c multithreading
3个回答
2
投票
static成员函数在part1内创建一个本地类...

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或将其包装在模板帮助器类中。


6
投票
可以怎么办?

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

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

* Nitpicker的一角:不包括一开始就无效的指针以及故意共享的内存


-1
投票
© www.soinside.com 2019 - 2024. All rights reserved.