【问题标题】:A simple method for a "master" thread to monitor "slave" threads“主”线程监控“从”线程的简单方法
【发布时间】:2012-04-26 08:00:10
【问题描述】:

作为我第一次真正尝试使用 pthreads,我正在寻求调整我已经编写的应用程序以使用线程。

我想到的范式基本上是有一个“主”线程,它遍历要处理的数据项列表,为每个线程启动一个新线程,在任何给定时间运行 MAX_THREADS 个线程(直到剩余任务少于此),每个任务对列表中的单个数据元素执行相同的任务。

主线程需要知道任何时候任何线程完成其任务并返回(或 pthread_exit()'ed),立即启动一个新线程来执行列表中的下一个任务。

我想知道的是,人们使用这种设计的首选方法是什么?除了数据方面的考虑,用于完成此任务的最简单的 pthreads 函数集是什么?显然,pthread_join() 是作为“检查”线程的一种手段。

早期的实验一直在使用一个结构,作为 pthread_create() 的最后一个参数传递,它包含一个名为“running”的元素,线程在启动时将其设置为 true,并在返回前重置。主线程只是为循环中的每个线程检查此结构元素的当前值。

以下是程序用于线程管理的数据:

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”的方式?我希望尽可能使用最简单、最清晰、最干净的机制,不会导致任何意外的并发症。

感谢您的任何反馈。

【问题讨论】:

    标签: pthreads posix


    【解决方案1】:

    与其说是“pthreads-y”方式,不如说是(通用)多线程方式。你所拥有的并没有什么问题,但它比它需要的更复杂和低效。

    更标准的设计是使用线程池。主线程产生一堆读取队列的工作线程。主人将工作放入队列中,所有工作人员都在处理队列中的工作。这消除了不断启动和终止线程的需要(尽管更复杂的池可以有一些机制来根据工作负载增加/减少池的大小)。如果线程必须返回数据或状态信息,它们可以使用 master 可以读取的输出队列(可能只是指向实际数据的指针)。

    这仍然留下了处理完成后如何摆脱线程的问题。再次,这是一种主从关系,因此建议主人告诉奴隶关闭自己。这相当于使用某些程序开关(例如您当前拥有的),在某处使用条件变量,发送信号或取消线程。这里有很多关于这个主题的问题(和很好的答案)。

    【讨论】:

    • 谢谢,Duck,是的,我喜欢你提出的这个想法。不过,唯一的问题是我确实需要在设计中进行一定程度的同步。
    • (哎呀,回车太快了)主线程需要等待某一组从属线程全部完成,所以它可以使用它们生成的一些信息来创建一个输出文件。我确实认为我需要对设计进行更多思考。 最好不要陷入线程管理的困境,而让一切或多或少地自主和协作地工作。将不得不考虑这一点。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多