作为我第一次尝试使用pthreads,我正在寻找适应我已经编写的应用程序来使用线程。
我想到的范例基本上是有一个“主”线程,它遍历要处理的数据项列表,为每个数据项启动一个新线程,MAX_THREADS线程在任何给定时间运行(直到数量为止)其余任务少于此数),每个任务对列表中的单个数据元素执行相同的任务。
主线程需要知道任何线程何时完成其任务并返回(或pthread_exit()'ed),立即启动新线程以执行列表中的下一个任务。
我想知道的是人们使用这种设计的首选方法是什么?除了数据考虑之外,用于实现此目的的最简单的pthreads函数集是什么?显然,pthread_join()作为一种“检查”线程的方法。
早期的实验一直在使用一个结构,作为最后一个参数传递给pthread_create(),它包含一个名为“running”的元素,线程在启动时设置为true,并在返回之前重置。主线程只是为循环中的每个线程检查此struct元素的当前值。
以下是程序用于线程管理的数据:
typedef struct thread_args_struct
{
char *data; /* the data item the thread will be working on */
int index; /* thread's index in the array of threads */
int thread_id; /* thread's actual integer id */
int running; /* boolean status */
int retval; /* value to pass back from thread on return */
} thread_args_t;
/*
* array of threads (only used for thread creation here, not referenced
* otherwise)
*/
pthread_t thread[MAX_THREADS];
/*
* array of argument structs
*
* a pointer to the thread's argument struct will be passed to it on creation,
* and the thread will place its return value in the appropriate struct element
* before returning/exiting
*/
thread_args_t thread_args[MAX_THREADS];
这看起来像是一个声音设计吗?有没有更好的,更标准化的方法来监控线程的运行/退出状态,更多的是“pthreads-y”方式?我希望使用最简单,最清晰,最干净的机制,不会导致任何意外的并发症。
感谢您的反馈。
答案 0 :(得分:0)
没有像(通用)多线程方式那样的“pthreads-y”方式。你所拥有的东西没有任何问题,但它比它需要的更复杂,效率更低。
更标准的设计是使用线程池。主线程产生一堆读取队列的工作线程。主人将工作放入队列中,所有工作人员都在处理队列中的工作。这消除了不断启动和终止线程的需要(尽管更复杂的池可以有一些机制来根据工作负载增加/减少池大小)。如果线程必须返回数据或状态信息,则它们可以使用主机可以读取的输出队列(可能只是指向实际数据的指针)。
这仍然留下了在完成处理后如何摆脱线程的问题。同样,这是一个主工关系,因此建议主人告诉奴隶关闭自己。这相当于使用某些程序开关(例如您当前拥有的),在某处使用条件变量,发送信号或取消线程。这里有很多关于这个主题的问题(和好的答案)。