如何在Qt C ++编程中使用线程实现“先到先得”调度算法?

问题描述 投票:0回答:2

我希望将进程添加到动态列表,然后使用“先到先得”调度算法来调度这些进程。调度算法最多只能同时运行5个进程,并且当一个进程终止时,它应该发出一个信号来指示终止。

然后,当一个进程终止时,一旦队列中有进程,则应使用调度算法调度另一个进程。

也请注意,每个进程都可以访问一个整数共享列表,一次只能一个进程访问。我已经知道如何通过使用QMutex锁定共享整数列表来做到这一点。理想情况下,我正在寻求一个示例,以便可以理解。

//mutex example
QMutex mutex
while(!mutex->tryLock()){
    //enter code here
}
this->performTask(); // 
mutex.unlock();
qt qt4 operating-system
2个回答
0
投票

您将有5个扩展了QThread的类的实例。每个类都将执行一个QProcess并等待其结束。

class MyThread : public QThread
{
public:
    MyThread(MyScheduler& aScheduler)
    :   iScheduler(aScheduler)
    {
    }

    void ExecuteProgram(const QString& aProgramName)
    {
        iProgramName = aProgramName;
        start();
    }

    void run()
    {
        iProcess.start(iProgramName);
        iProcess.waitForFinished(-1);
        iScheduler.SignalProgramTerminated(this);
    }

private:
    MyScheduler& iScheduler;  // This is your FCFS scheduler.
    QString iProgramName;
    QProcess iProcess;
};

((我尚未编译此文件,但应该会给您一些进展)。


0
投票

您可以使用QThreadPool创建一个由5个线程组成的池,这些线程运行您的进程,并使用QQueue以FIFO方式将挂起的进程排队。

编辑:关于互斥锁:互斥锁保护由多个线程执行的一段代码形式的信息。锁定互斥锁的线程将被阻塞,直到没有其他线程持有该锁为止。使用互斥锁的最简单方法是使用QMutexLocker。

void myclass::modifyList(IntegerList* list)
{
    QMutexLocker lock(list->getMutex()); //this will block if an other thread holds the mutes 

    //do stuff
}
© www.soinside.com 2019 - 2024. All rights reserved.