2

这是一门功课。我正在尝试创建点对点线程模型:

http://www.informit.com/articles/article.aspx?p=169479&seqNum=5

在委托模型有一个将任务委托给工作线程的老板线程的情况下,在对等模型中,所有线程都具有相同的工作状态。尽管有一个线程最初创建执行所有任务所需的所有线程,但该线程被视为工作线程并且不进行委托。在这个模型中,没有集中式线程。

因此,我的主线程将创建 5 个线程,它们开始监听我的队列并使用主线程创建作业 10 秒。而且由于所有线程都必须执行任务,因此该线程还必须等待作业。我怎样才能做到这一点?

BlockingQueue<Job> queue = new ArrayBlockingQueue<Job>(1000);

    Collection<Thread> workers = new ArrayList<Thread>();
    for(int i = 0; i < 5; i++) {
        Thread thread = new Thread(new Worker(queue));
        workers.add(thread);
        thread.start();
    }

    long endTime = System.currentTimeMillis() + 10000;
    Random r = new Random();
    while(System.currentTimeMillis() < endTime) {
        try {
            CalculateJob job = new CalculateJob(r.nextInt(50), r.nextInt(50), r.nextInt(50));
            queue.put(job);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }   

所以我的主线程将与创建线程一起工作,而工作人员只是坐在queue.take().

我是否正确理解在点对点模型中,每个线程都必须queue.take()或等待作业。如果是这样,我该怎么做?有什么建议么?

4

4 回答 4

1

您链接到的文章没有说明如何创造就业机会。它们可能意味着它们是从其他地方创建的。查看各个模型的数据,我们看到:

  • 在“委托模型”中,主线程决定由哪个工作线程执行 Job
  • 在“点对点模型”中,对等线程从一个公共队列中获取工作(并且恰好哪个线程首先获得下一个作业),因此对等线程相互协调。

通过使用 ConcurrentQueue,您实际上实现了对等模型。

总而言之,它们的区别在于线程如何协调工作,而不是如何创建工作。

于 2012-09-30T11:31:01.830 回答
1

正如您提供的文章所建议的那样

在对等模型中,所有线程都具有相同的工作状态。尽管有一个线程最初创建执行所有任务所需的所有线程,但该线程被视为工作线程并且不进行委托

您的 Boss 线程恰好也是工作者,它将创建放入队列中的作业,并且take()一旦完成放置作业,就可以通过调用来充当工作者。

现在,如果您想阻塞所有线程,直到 Boss 线程完成创建作业,那么您可以使用CountDownLatch单个计数。

我真的不知道这种模式是否对我们的生产者/消费者模式有任何优势。

于 2012-09-30T11:31:16.343 回答
0

虽然这个问题是用标记的,并且因为workcrew 模型听起来好像是并发的一般概念,但我在 C 中添加了伪代码。

在对等模型(也称为工作组模型)中,一个线程必须在程序启动时创建所有其他对等线程。该线程随后充当处理请求的另一个对等线程,或暂停自身等待其他对等点完成。对等模型使每个线程负责自己的输入。对等点提前知道自己的输入,有自己的私人获取输入的方式,或与其他对等点共享单点输入。

在此处输入图像描述

main()
{
   pthread_create( ... thread1 ... task1 )
   pthread_create( ... thread2 ... task2 )
   .
   .
   .
   signal all workers to start
   wait for all workers to finish
   do any clean up
}

task1()
{
   wait for start
   perform task, synchronize as needed if accessing shared resources
   done
}

task2()
{
   wait for start
   perform task, synchronize as needed if accessing shared resources
   done
}

所有来源均引用自PThreads Programming - A POSIX Standard for Better Multiprocessing, Buttlar, Farrell, Nichols

于 2017-07-31T11:06:16.413 回答
0

我认为老板点对点之间的唯一区别是请求的类型(输入)。如果请求是不同的类型,那么程序需要确定要调用哪个线程,这是一个老板模型,如果请求是相同的,比如乘法矩阵,那么它不需要老板,我们有对等模型。

于 2021-09-19T07:27:53.433 回答