0

我正在做一个班级项目。我需要设计一个 cpu、一个 lts(长期调度程序)和一个调度程序。cpu和lts是线程,它们操作同一个线程安全的链表(也就是说链表上的所有操作必须互斥)。cpu由三个组成部分。(启动:它在执行开始时只工作一次并得到就绪队列中的第一项。获取:它将从正在运行的进程的代码段中获取第[IP]条指令到IR。执行它将执行IR中的指令)。Lts 在创建时间为时将假设进程放入就绪队列。创建时间是在创建进程之前执行的总指令数。

DWORD WINAPI cpuFunction(){
    boot();

    while(cpu.runningProcess != NULL){
        WaitForSingleObject(readyQueue->mutex, INFINITE);
        fetch();
        exec();
        ReleaseMutex(readyQueue->mutex);

    }


    return (DWORD) 0;
}


DWORD WINAPI ltsFunction(){
    processList =createProcessList(FILE_NAME); 
    readyQueue = createList();
    while(1){
        WaitForSingleObject(readyQueue->mutex, INFINITE);
        if(processList != NULL){
            nextProcess = getFromList(processList,0);
            if(nextProcess->processCreationTime == cpu.executedInstructionCount){
                nextProcess = removeFromList(processList,0);
                addToList(readyQueue, nextProcess);
                printf("Process %d is in the ready queue.\n",nextProcess->processID);
            } else{
                nextProcess = NULL;
            }
        }
        ReleaseMutex(readyQueue->mutex);
    }
    Sleep(500);

}

在我的代码中,我想做的是在每个执行步骤之后,必须解锁 cpu 函数中的互斥锁,并且 lts 应该检查它是否是下一个进程的创建时间。这就是我使用互斥锁的原因。但问题是它们不起作用。首先 lts 将第一个进程放入就绪队列(其创建时间为 0),然后 cpu 开始运行,但它不会停止,直到第一个进程终止。但是,在执行指令后,必须将第二个进程放入就绪队列中。我不知道我该如何解决,我真的需要帮助。

4

2 回答 2

1

如果一个线程需要在没有锁定互斥锁的情况下等待另一个线程,标准方法是使用条件。如果我正确阅读了您的问题,您有两个线程需要使用受相同互斥锁保护的东西,交错。

关于条件的重要一点是,它们总是与互斥锁相关联。线程锁定互斥锁,然后在互斥锁被锁定时开始等待条件,这将释放互斥锁。然后当线程从条件等待中唤醒时,它将再次锁定互斥锁。当另一个线程想唤醒一个等待条件的线程时,它必须先锁定同一个互斥锁,然后发出条件信号唤醒等待它的线程,然后释放互斥锁(这样被唤醒的线程实际上可以获得互斥锁) .

此 MSDN 页面提供了一个示例:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms686903%28v=vs.85%29.aspx

但是你最好至少浏览一下这个 MSDN 主题下关于同步的所有内容:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms686353%28v=vs.85%29.aspx

于 2012-12-22T20:11:08.550 回答
1

我不是 100% 确定,但我猜会发生什么是第一个 CPU 在第二个 CPU 有机会运行之前“抢占”了 Mutex。您可以通过sleep(20);在 realease 之后添加 a 来尝试[这显然是一个糟糕的解决方案,但它会显示这是否真的是问题]。

即使您的系统中有多个内核/CPU,也不能保证等待时间最长的线程会赢得争夺互斥锁的竞赛。

不使用互斥锁当然是一种解决方案,但是我认为您仍然需要了解自己做错了什么,然后才说“哦,互斥锁不起作用,我会做其他事情”-因为很有可能除非您了解发生了什么,否则您迟早会在其他地方遇到相同或类似的问题。

于 2012-12-22T20:27:25.653 回答