C 如何使用POSIX线程使用线程标识符调用线程函数?

C 如何使用POSIX线程使用线程标识符调用线程函数?,c,linux,multithreading,C,Linux,Multithreading,我是posix线程的新手。我正在从事一个项目,其中一个组件在初始化时创建所有posix线程。如果有任何线程空闲,则另一个组件必须请求池管理器。如果空闲,池管理器将返回线程处理程序,而另一个组件将其数据移交给该线程处理程序。我有两个问题: 初始化时,创建线程意味着调用pthread_create()函数。因此,线程执行pthread_create()中提到的例程并退出。池管理器如何识别空闲线程 若线程在其例程中等待其数据,那个么其他组件如何使用线程处理程序将其数据移交给线程 通常使用互斥量、条件变

我是posix线程的新手。我正在从事一个项目,其中一个组件在初始化时创建所有posix线程。如果有任何线程空闲,则另一个组件必须请求池管理器。如果空闲,池管理器将返回线程处理程序,而另一个组件将其数据移交给该线程处理程序。我有两个问题:

  • 初始化时,创建线程意味着调用pthread_create()函数。因此,线程执行pthread_create()中提到的例程并退出。池管理器如何识别空闲线程

  • 若线程在其例程中等待其数据,那个么其他组件如何使用线程处理程序将其数据移交给线程


  • 通常使用互斥量、条件变量和一些共享内存结构。 例如,您将创建一个数组、一个互斥体和一个条件变量。那么池中的工作线程将:

  • 锁定互斥锁
  • 等待条件变量(互斥锁会自动释放)
  • 一旦wait返回,就意味着cond var得到了信号(并且互斥锁再次为您锁定)
  • 从阵列中移除工件
  • 解锁互斥锁(或返回(2)
  • 在要将作业提交到池的客户端线程中:

  • 锁定互斥锁
  • 向数组添加工作
  • 向条件变量发送信号
  • 有很多关于这方面的教程,例如。

    阅读更多关于pthread及其同步(互斥锁、condvar、rwlock、屏障)的信息。您可以创建固定数量的线程,等待某个任务队列更改。您似乎觉得池中的线程严格来说是客户端代码;它们通常不是。池通常有自己的线程进程,任务是运行某个程序。该程序通常来自推送其自己的进程的池客户端将一些参数数据放入队列,然后让池管理如何将任务分配给池管理的线程。池中的线程进程被编码为同步如何安全地提取队列数据、执行用户任务以及返回池进行更多工作。书籍和文章都是关于该主题的;获取一个。搜索术语“线程池"在线。基本上,创建线程就像雇佣一个人。线程池雇佣一群人,但不给他们任何工作。当你向线程池请求一个免费工作人员时,该工作人员会被分配一些工作。当线程完成并退出时,就像解雇工作人员。然而,在线程池上下文中,他们只向这避免了启动和停止线程(雇佣和解雇工人)的开销。