Multithreading 跟踪不同线程上对象实例的状态?

Multithreading 跟踪不同线程上对象实例的状态?,multithreading,events,status,consumer,producer,Multithreading,Events,Status,Consumer,Producer,我在业余时间写了一个图像板刮板来教我关于线程的知识。目前,我正在使用生产者/消费者类型模式来促进这项工作。然而,我遇到了一个问题 现在,我有“队列处理器”,可以观察特定类型的线程安全队列并对其进行操作。这些队列处理器每X秒轮询一次目标队列,如果队列上有一个项目等待处理,队列处理器将取消该项目的队列,使用该项目启动一个新线程,然后启动该线程。在每个线程上,都会调用长时间运行的方法(比如连接到网站并下载文件)。通过这种方式,每个项都有自己的线程来运行 我很难弄清楚如何在每个线程上处理每个项目时报告其

我在业余时间写了一个图像板刮板来教我关于线程的知识。目前,我正在使用生产者/消费者类型模式来促进这项工作。然而,我遇到了一个问题

现在,我有“队列处理器”,可以观察特定类型的线程安全队列并对其进行操作。这些队列处理器每X秒轮询一次目标队列,如果队列上有一个项目等待处理,队列处理器将取消该项目的队列,使用该项目启动一个新线程,然后启动该线程。在每个线程上,都会调用长时间运行的方法(比如连接到网站并下载文件)。通过这种方式,每个项都有自己的线程来运行

我很难弄清楚如何在每个线程上处理每个项目时报告其状态

例如,假设我们有主线程MT。MT生成子线程T1、T2、T3、T4和T5。每个线程上都有一个对应的对象O1…O5。例如,当这些对象在其线程上被处理时,它们可以处于三种不同的状态——S1、S2、S3

当对象O的状态改变时,如何向主线程MT报告每个对象O的状态

我尝试使用事件来报告状态,但我遇到了一些不可靠的结果。我在谷歌上搜索了一些关于使用线程和事件的信息,但没走多远

任何帮助都将不胜感激


谢谢。

一种方法是创建另一个线程安全队列,用于报告状态更新。每次线程更改其状态时,它都会推送一个元组/对象,其中包含作业的唯一标识符、新状态、线程id以及您认为必要的任何其他内容

一旦这样做了,您将遇到另一个问题:谁将轮询队列?您可以在主线程检查到作业队列之间执行此操作,但这可能很糟糕,并且可能会不必要地降低处理速度。您也可以生成另一个线程来执行此操作,但我猜您需要将状态报告给主线程,因此这没有帮助

实际上有一种更好的方法来组织程序。您可以创建一个线程池,让作业线程自己进行轮询,而不是让主线程连续轮询作业队列并创建线程(这非常昂贵)。这将使主线程可以自由轮询状态队列,等待它查找的任何事件

下面是一些伪代码来说明这个概念:

main_thread()
    ...
    thread_pool = create_pool(get_core_count());
    thread_pool.execute(worker_thread);

    while(true)
         status = status_queue.pop_blocking();
         if (check_status(status) == WE_BE_DONE) 
             break;

    thread_pool.interrupt();
    ...

worker_thread()
    while(true)
        job = job_queue.pop_blocking();
        process_job(job);
        status_queue.push({job.id, thread_id, WE_DONE});
本质上,这是创建一个线程池,其中每个CPU核心包含一个工作线程(一个ok默认值)。接下来,它在每个工作线程中执行函数
worker\u thread
(该函数应该是自解释的)。然后,主线程持续检查状态队列中的某个未指定事件。一旦发生这种情况,它将终止工作线程并继续执行程序的其余部分

在这个例子中有三件事值得注意。首先,我建议在手动轮询实现上使用阻塞pop调用(
pop_blocking
)。它使用起来简单得多,而且可能效率更高。接下来,我使用
thread\u pool.interrupt()
杀死作业线程,但根据您使用的语言或库,这可能不是最聪明的方法。如果您的语言支持这类内容,那么在
try-catch
语句中围绕
do\u-job(job)
调用可能也是一个好主意

请注意,由于您的问题在细节上非常简单(其中一个问题使用的语言),因此您肯定需要根据您要完成的任务调整解决方案。这仍然会给你一个很好的起点