【问题标题】:how to write pthread_create on the same function?如何在同一个函数上编写 pthread_create?
【发布时间】:2010-02-13 04:17:15
【问题描述】:

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

// 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


    【解决方案1】:

    如果你可以这样做呢?

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

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

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

    【讨论】:

    • 感谢您的回复。我已经用 pthreads 编写了 thinks 程序,此外 Windows 还支持 fork()。在另一个内部声明一个函数怎么样,这可能吗?谢谢
    • 一些 C 或 C++ 编译器可能支持嵌套函数作为特定于编译器的扩展。在 C++ 中,你可以通过定义一个局部类来获得类似的东西,但它不能从封闭函数的范围内访问任何变量(即它不是一个闭包)。 C++0x 中的 lambda 函数是否更符合您的要求?
    • “本地”函数和 lambdas 不做任何常规函数不做的事情。他们被调用并返回相同。你最好用更熟悉的语法来处理线程语义。
    • 无论如何都无关紧要,因为 lambda 和仿函数通常不是函数指针,不能作为 pthread_create 的参数传递。您可以改用 Boost.Threads 库。
    【解决方案2】:

    如果您只想将 part2 的函数移动到 part1 中,您可以在 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 或将其包装在模板帮助器类中。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 2016-07-07
        • 1970-01-01
        • 2022-01-19
        相关资源
        最近更新 更多