如何使进程与随机数量的活动线程同步?

Posted

技术标签:

【中文标题】如何使进程与随机数量的活动线程同步?【英文标题】:How to synchronize a process with random number of active threads? 【发布时间】:2019-05-18 18:51:11 【问题描述】:

我有以下问题。我的进程产生了 4 个线程,它们独立执行相同的任务,需要等待所有线程完成处理,然后再进行下一个处理迭代。但是,活动线程的数量,即处理数据的线程数,需要等待其他线程完成的数量在 1 到 4 之间是可变的。例如,有时 2 个线程将处理数据,它们需要相互等待在继续之前。

我已经读过屏障可以为我做到这一点,但是,当它们被创建时,我必须指定要等待的线程数,而我的应用程序并非如此。此外,由于应用程序的实现方式,每次都创建/销毁障碍会很尴尬和复杂。

我想知道是否有其他方法可以解决这个问题。

谢谢!

【问题讨论】:

第一个问题是你的程序是用哪种语言实现的。 @Adonis,它在 C 中。 你说,“我的进程产生 4 个线程”,就好像它总是一样,然后你说,“有时 2 个线程会处理数据......”那么,这是否意味着当两个线程在处理数据时,还有另外两个线程处理数据?如果是这样,那么另外两个在做什么?他们只是在等待吗?如果是这样,那么为什么不让它们在两个活动线程正在使用的同一屏障上等待呢? @SolomonSlow,总是有 4 个线程,但是,提供它们的数据生产者是随机的,所以在我给出的示例中,其中两个正在等待条件变量以等待新数据的存在。空闲线程不能在等待条件的地方等待。变量,而其他线程正在处理。 那么,您是说“空闲”线程是可能随时开始工作的线程?我不知道如果你无法知道他们中的任何一个人什么时候可能开始任务,你怎么可能决定他们是否都完成了任务。 【参考方案1】:

这就是您可以使用 Semaphore 实现它的方法。

// Global Sempahore initialized to zero.
Sempahore global_sempahore(0)

// Your main thread which spawns your 'n' worker thraeds.
// After spawning 'n' threads your main thread will wait for those threads to finish.
for (int i=0; i<n; i++) 
    global_sempahore.sem_wait();



// This is your worker thread routine.
// After processing the common work routine before exiting each thread will signal the sempahore.
global_sempahore.sem_post();

这个想法是在锁定模式下用 0 初始化信号量。 在主线程中生成 n 个工作线程后,在信号量上等待 n 次。

在退出信号之前的工作线程中。

这将确保主线程只有在所有 n 个线程执行完毕后才会被唤醒。

【讨论】:

以上是关于如何使进程与随机数量的活动线程同步?的主要内容,如果未能解决你的问题,请参考以下文章

大话操作系统之进程与线程

操作系统_进程同步与进程通信_多线程技术的优势

Java中的线程同步与异步如何理解?

[C++11 多线程同步] --- 线程同步概述

操作系统原理-进程线程模型并发与同步

(进程管理)03.进程和线程的同步方式